我有一个std::vector
包含类BoundingBox
(std::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
答案 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());
}
易于记忆管理,轻松生活。