从函数内对象的向量中释放内存
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();
}
循环的每一步都会在值之间执行比较,并返回与新对象匹配的"新"向量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
之后,创建的对象仍然被分配在内存中,我不明白为什么会发生这种情况,因为指针没有丢失,而是保持在向量中。
我想从内存中释放创建的对象,并完全清除指针中的向量。两者都是我的目标。
提前谢谢。
您可以通过在clear
或resize
之后调用shrink_to_fit
,向C++库std::vector"提交"一个非绑定请求,以释放其分配的内存。
请注意,这是不绑定的,这实际上意味着每个正常的实现都会释放内存,但严格来说,您不能依赖于这个假设。
我还强烈建议用std::unique_ptr替换向量中的原始指针(如果不考虑继承/切片,甚至只替换对象本身(。它将减轻函数的视觉负载,并防止将来内存泄漏。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?