gpt4 book ai didi

c++ - 试图向现有 std::vector 添加元素的堆损坏

转载 作者:行者123 更新时间:2023-11-28 06:22:49 25 4
gpt4 key购买 nike

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

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

第二个函数为我提供了我需要添加到之前创建的 vector 中的候选项:

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

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

我还有一个函数可以在之后从 vector 中删除元素,但我想一旦我完成添加部分就可以解决这个问题。

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

*** 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

最佳答案

首先,您使用的编译器是否比您老?

是的 -> 停止这样做。你为什么这么讨厌自己?

否 -> 好消息,您的教授“教”您的有关 C++ 的所有内容都是错误和错误的。编译器非常擅长返回值优化。让您的函数返回值,它们将被移动而不是被复制,这基本上是免费的,并停止在应用程序代码中这种新建/删除/原始指针的疯狂行为。

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

简单的内存管理,轻松的生活。

关于c++ - 试图向现有 std::vector 添加元素的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29049584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com