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

时间:2018-07-19 09:03:53

标签: c++ object vector memory-leaks delete-operator

我的代码内部发生内存泄漏,但是我想不出一种方法来释放在创建对象的函数中分配的内存并将其推入对象的向量中。

主要功能如下:

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的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之后,创建的对象仍然分配在内存中,由于指针并没有丢失,但我不明白发生这种情况的原因。将其保存在向量中。

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

谢谢。

1 个答案:

答案 0 :(得分:3)

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

请注意,这是非绑定性的,实际上意味着每个理智的实现实际上都会释放内存,但严格来讲,您不能移植此假设。

我也强烈建议您使用std :: unique_ptr(或对象本身,如果不考虑继承/切片)替换向量中的原始指针。这样可以减轻功能的视觉负担,并防止将来发生内存泄漏。