【发布时间】:2018-12-27 08:19:43
【问题描述】:
我的代码中存在内存泄漏,但我找不到解决方案来释放在创建对象并将其推入对象向量的函数内部分配的内存。
主要功能如下:
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();
}
循环的每一步都会在值之间执行比较,并返回一个“新”向量matchingMtiae和新对象。然后,对于下一次迭代,我想完全释放这个向量并从内存中释放它的内容。创建对象并将其推入向量matchingMtiae 的匹配函数如下所示:
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 之后,创建的对象仍然分配在内存中,我无法理解为什么会发生这种情况,因为指针没有丢失而是保留它在向量内。
我想从内存中释放创建的对象并彻底清除指针中的向量。两者都是我的目标。
提前致谢。
【问题讨论】:
-
这里要 100% 清楚:您的问题是关于保持其指针分配的向量还是向量内的指针是否仍指向对象/内存地址?
-
摆脱指针,新的和删除的初学者。这里不需要这些。
-
你认为你有内存泄漏的原因也很不清楚。
-
@Athosvk 我正在寻找提到的两个目标,我需要完全释放我的向量,以便在下一次迭代中再次填充,并从内存中释放之前创建的对象以避免内存泄漏。
-
@n.m.我运行英特尔的 Inspector 工具,它警告了我。我还从 linux 终端执行了 htop 命令,内存随着时间的推移不断增加。
标签: c++ object vector memory-leaks delete-operator