从函数内部的对象向量中释放内存
Free memory from vector of objects inside a function
我的代码中存在内存泄漏,但我无法找到释放在创建对象的函数内分配的内存并将其推入对象向量的解决方案。
主要函数如下:
void foo(vector<vector<BCC>> &features){
vector<MinutiaPair*> matchingMtiae;
for (int i = 0; i < features.size(); i++){
Match(features[0], features[i], matchingMtiae);
ms += s;
// Free memory
for (int j = 0; j < matchingMtiae.size(); j++)
delete (matchingMtiae[j]);
matchingMtiae.clear();
}
循环的每一步都在值之间执行比较,并且 "new" 向量 matchingMtiae 与新对象一起返回。然后,对于下一次迭代,我想完全释放这个向量并从内存中释放它的内容。创建对象并将其推入向量 matchingMtiae
的 Match 函数如下所示:
void Match(vector<BCC> &qt, vector<BCC> &tt, vector<MinutiaPair*> &reducedMatchingPairs) {
vector<MinutiaPair*> localMatching;
for (int i = 0; i < qt.size(); i++)
for (int j = 0; j < tt.size(); j++)
{
double currSim = qt[i].Match(tt[j], true);
if (currSim > 0)
{
qt[i].minutia.Flag = false;
tt[j].minutia.Flag = false;
MinutiaPair *pair = new MinutiaPair(qt[i].minutia, tt[j].minutia, currSim);
localMatching.push_back(pair);
}
sort(localMatching.begin(), localMatching.end(), MtiaPairComparer::ComparePointers);
for (int k = 0; k < localMatching.size(); k++)
{
if (!localMatching[k]->QueryMtia->Flag || !localMatching[k]->TemplateMtia->Flag)
{
reducedMatchingPairs.push_back(localMatching[k]);
localMatching[k]->QueryMtia->Flag = true;
localMatching[k]->TemplateMtia->Flag = true;
}
else
{
delete (localMatching[k]);
}
}
}
调试我的代码我意识到在删除和清除向量 matchingMtiae
之后,创建的对象仍然在内存中分配,我不明白为什么会发生这种情况,因为指针没有被丢失但将其保存在向量中。
我想从内存中释放创建的对象并完全清除指针中的向量。两者都是我的目标。
提前致谢。
您可以 "submit" 向 C++ 库 std::vector 发出非绑定请求,通过在 clear
或 resize
之后调用 shrink_to_fit
来释放其分配的内存.
请注意,这是非绑定的,这实际上意味着每个理智的实现实际上都会释放内存,但严格来说您不能移植地依赖这个假设。
我还强烈建议用 std::unique_ptr 替换向量中的原始指针(或者甚至只是对象本身,如果不关心 inheritance/slicing)。它将减轻函数的视觉负载并防止将来发生内存泄漏。
我的代码中存在内存泄漏,但我无法找到释放在创建对象的函数内分配的内存并将其推入对象向量的解决方案。
主要函数如下:
void foo(vector<vector<BCC>> &features){
vector<MinutiaPair*> matchingMtiae;
for (int i = 0; i < features.size(); i++){
Match(features[0], features[i], matchingMtiae);
ms += s;
// Free memory
for (int j = 0; j < matchingMtiae.size(); j++)
delete (matchingMtiae[j]);
matchingMtiae.clear();
}
循环的每一步都在值之间执行比较,并且 "new" 向量 matchingMtiae 与新对象一起返回。然后,对于下一次迭代,我想完全释放这个向量并从内存中释放它的内容。创建对象并将其推入向量 matchingMtiae
的 Match 函数如下所示:
void Match(vector<BCC> &qt, vector<BCC> &tt, vector<MinutiaPair*> &reducedMatchingPairs) {
vector<MinutiaPair*> localMatching;
for (int i = 0; i < qt.size(); i++)
for (int j = 0; j < tt.size(); j++)
{
double currSim = qt[i].Match(tt[j], true);
if (currSim > 0)
{
qt[i].minutia.Flag = false;
tt[j].minutia.Flag = false;
MinutiaPair *pair = new MinutiaPair(qt[i].minutia, tt[j].minutia, currSim);
localMatching.push_back(pair);
}
sort(localMatching.begin(), localMatching.end(), MtiaPairComparer::ComparePointers);
for (int k = 0; k < localMatching.size(); k++)
{
if (!localMatching[k]->QueryMtia->Flag || !localMatching[k]->TemplateMtia->Flag)
{
reducedMatchingPairs.push_back(localMatching[k]);
localMatching[k]->QueryMtia->Flag = true;
localMatching[k]->TemplateMtia->Flag = true;
}
else
{
delete (localMatching[k]);
}
}
}
调试我的代码我意识到在删除和清除向量 matchingMtiae
之后,创建的对象仍然在内存中分配,我不明白为什么会发生这种情况,因为指针没有被丢失但将其保存在向量中。
我想从内存中释放创建的对象并完全清除指针中的向量。两者都是我的目标。
提前致谢。
您可以 "submit" 向 C++ 库 std::vector 发出非绑定请求,通过在 clear
或 resize
之后调用 shrink_to_fit
来释放其分配的内存.
请注意,这是非绑定的,这实际上意味着每个理智的实现实际上都会释放内存,但严格来说您不能移植地依赖这个假设。
我还强烈建议用 std::unique_ptr 替换向量中的原始指针(或者甚至只是对象本身,如果不关心 inheritance/slicing)。它将减轻函数的视觉负载并防止将来发生内存泄漏。