Heap Corruption试图将元素添加到现有的std :: vector中

时间:2015-03-14 13:38:29

标签: c++ vector heap

我有一个std::vector包含类BoundingBoxstd::vector<BoundingBox>的元素,我称之为BB_Array)。 首先,我使用一个函数创建这个向量,我将在这里简化:

BB_Array* Detector::generateCandidateRegions(BB_Array* candidates){
    BB_Array* result = new BB_Array(); // without new here, i get segmentation fault
    BB_Array tempResult;

    // apply tests to candidates and add the good ones to tempResult ... 
    // ... using tempResult.push_back((*candidates)[i]);

    for (int i=0; i < tempResult.size(); i++){
        // apply more tests to tempResult[i] and, if necessary, add it...
        // ... using result->push_back(maxCandidate); 
    }

    return result;
}

根据valgrind的说法,这个功能有效,没有内存泄漏。 现在,该函数需要应用一次(性能),我需要一个函数来添加元素。这是我遇到问题的地方。我现在这样做的方式是:

BB_Array* Detector::addCandidateRegions(BB_Array* candidates) {
    BB_Array* result = new BB_Array();
    BB_Array sparseDetections;

    // apply tests and add stuff to sparseDetections using... 
    // ... sparseDetections.push_back((*candidates)[i]);

    for (int i=0; i < sparseDetections.size(); i++){
        // add things to result using result->push_back()
    }

    return result;
}

第二个函数给了我需要添加到之前创建的向量的候选者:

BB_Array *newCandidates = addCandidateRegions(...);
if (newCandidates->size() > 0){
   denseCandidates->insert(denseCandidates->end(), newCandidates->begin(), newCandidates->end());
   delete newCandidates;
}

现在,这导致堆损坏,程序在500张图像之后崩溃。那么我做错了什么?有没有更好的方法呢?

我之后还有一个从矢量中删除元素的功能,但我想我可以在完成添加部分后弄明白。

编辑:忘记输入错误消息:

*** Error in `./C_Arnoud_Calibrated_Detector': malloc(): smallbin double linked list corrupted: 0x0000000001f4eed0 ***
Aborted (core dumped)

每次都不会发生相同的迭代,有时我会得到一个分段错误。

编辑2:我今天修好了。没有堆问题。我可能已经厌倦了并且在一个特定场景中使用了错误的索引,因此在成千上万的迭代中,有时会发生意想不到的事情并且它会破坏一切。感谢大家的建议,如果您使用物体探测器,现在可以安全地使用=) https://github.com/CArnoud/C_Arnoud_Calibrated_Detector

1 个答案:

答案 0 :(得分:1)

首先,您使用比您年长的编译器吗?

是 - &gt;别那样做。你为什么这么恨自己?

否 - &gt;好消息,你的教授“教你”C ++的一切都是错误和错误的。编译器非常擅长返回值优化。使函数返回值,它们将被移动而不被复制,这基本上是免费的,并在应用程序代码中停止这个新的/ delete / raw指针疯狂。

BB_Array Detector::generateCandidateRegions(BB_Array& candidates){
    BB_Array result; // Use values.
    BB_Array tempResult;

    // Do whatever the heck you want.

    for (int i=0; i < tempResult.size(); i++){
        // apply more tests to tempResult[i] and, if necessary, add it...
        // ... using result.push_back(maxCandidate); 
    }

    return result;
}

BB_Array newCandidates = addCandidateRegions(...);
if (newCandidates.size() > 0){
   denseCandidates.insert(denseCandidates.end(), newCandidates.begin(),
                          newCandidates.end());
}

易于记忆管理,轻松生活。