从函数内对象的向量中释放内存

Free memory from vector of objects inside a function

本文关键字:释放 内存 向量 函数 对象      更新时间:2023-10-16

我的代码中有内存泄漏,但我无法找到一个解决方案来释放在创建对象并将其推入对象向量的函数中分配的内存。

主要功能如下:

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();
}

循环的每一步都会在值之间执行比较,并返回与新对象匹配的"新"向量Mtiae。然后,在下一次迭代中,我想完全释放这个向量,并从内存中释放它的内容。创建对象并将其推入向量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之后,创建的对象仍然被分配在内存中,我不明白为什么会发生这种情况,因为指针没有丢失,而是保持在向量中。

我想从内存中释放创建的对象,并完全清除指针中的向量。两者都是我的目标。

提前谢谢。

您可以通过在clearresize之后调用shrink_to_fit,向C++库std::vector"提交"一个非绑定请求,以释放其分配的内存。

请注意,这是不绑定的,这实际上意味着每个正常的实现都会释放内存,但严格来说,您不能依赖于这个假设。

我还强烈建议用std::unique_ptr替换向量中的原始指针(如果不考虑继承/切片,甚至只替换对象本身(。它将减轻函数的视觉负载,并防止将来内存泄漏。