【发布时间】:2021-07-03 02:50:25
【问题描述】:
您好(我是一名 C++ 学生,正在努力学习,请不要在高级时烤我),
我在堆上的对象上创建了temArr。当我运行它而不删除堆上的temArr 时,我的程序编译没有问题,但是当我通过 valgrind 运行它时,在 temArr 上存在内存泄漏。但是当我用delete temArr;temArr = nullptr; 运行它时。我遇到了分段错误。
我试图在堆栈上做到这一点:
NodeList* n1(0); n1 = temArr; return n1->getNode(Index); delete temArr; temArr = nullptr; 它返回不正确的随机变量时。
有没有办法我可以将堆上的值放入堆栈中删除堆然后返回堆栈上的对象?还是我删除了我的堆错误,从而导致分段错误?
代码:
Node *PathSolver::findShortDis(NodeList *openList, Node *nodeG, NodeList *closeList) {
int Index =0;
NodeList* temArr = new NodeList();
for (int x = 0; x < openList->getLength(); x++) {
if (closeListCheck(openList->getNode(x), closeList)) {
temArr->addElement(openList->getNode(x));
}
}
//assign tem to the very first node of temA
int tem = temArr->getNode(0)->getEstimatedDist2Goal(nodeG);
//compare
for (int x = 0; x < temArr->getLength(); x++) {
if (temArr->getNode(x)->getEstimatedDist2Goal(nodeG) <= tem) {
tem = temArr->getNode(x)->getEstimatedDist2Goal(nodeG);
Index = x;
}
}
for(int x = 0; x < temArr->getLength(); x++) {
if (openList->getNode(x)->getCol() == temArr->getNode(Index)->getCol()
&& openList->getNode(x)->getRow() == temArr->getNode(Index)->getRow()){
Index = x;
}
}
// NodeList* n1(0);
// n1 = temArr;
// return n1->getNode(Index);
// delete temArr;
// temArr = nullptr;
return temArr->getNode(Index);
}
先谢谢你了。
【问题讨论】:
-
n1只是指向堆内存中相同位置的指针,删除该内存后自然无法访问它。如果您想将某些内容传输到堆栈,则需要复制实际对象而不是指向它的指针。例如删除之前的const auto result = temArr->getNode(Index);并返回result。 -
如果您正在使用生产代码,而不仅仅是为了了解
new/delete,请考虑使用遵循 C++ RAII 指南的std::unique_ptr(意味着unique_ptr会自动为你调用delete)。
标签: c++ memory-leaks stack c++14 heap-memory