【问题标题】:Free memory from vector of objects inside a function从函数内的对象向量中释放内存
【发布时间】: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


【解决方案1】:

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

请注意,这是非约束性的,这实际上意味着每个理智的实现实际上都会释放内存,但严格来说,您不能可移植地依赖此假设。

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

【讨论】:

  • 请注意,内存未释放的原因是因为性能。向量的生命周期通常很短,它已经在向量的析构函数中释放内存,或者被重用(如我们在这里看到的),保持内存分配的效率要高得多,而不是多次分配/释放。后者相当浪费,内存分配和释放不是免费的,尤其是当你有很多内存时。
  • 代替shrik_to_fit,你也可以使用旧的std::vector&lt;MinutiaPair*&gt;{}.swap(matchingMtiae);。请注意,默认构造的向量的容量不能保证为 0,但在实践中很可能是这样。
  • @DanielLangr 对,在这种情况下,这是一个选项。如果向量不为空,这不是一个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多