代码之家  ›  专栏  ›  技术社区  ›  sfandres94

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

  •  0
  • sfandres94  · 技术社区  · 7 年前

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

    主要功能如下:

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

    调试我的代码后,我意识到在删除和清除矢量之后 配对支原体 ,创建的对象仍在内存中分配,我无法理解发生这种情况的原因,因为指针没有丢失,而是保留在向量中。

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

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  3
  •   rubenvb    7 年前

    您可以“向”C++库STD::vector提交“非绑定请求”,通过调用来释放它分配的内存。 shrink_to_fit 之后 clear resize 是的。

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

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