【发布时间】:2018-01-20 21:36:30
【问题描述】:
我正在学习引用指针和内存泄漏。
我创建了一个方法,它接收指向 NodeData 的指针,创建一个包含 NodeData、左指针和右指针的节点,并根据其值插入它。我正在使用引用指针来遍历我的树。每次我声明一个新的 Node 对象并超出范围时,都会发生内存泄漏。
我以为既然指针引用指向了对象,它就没有消失。我的程序运行良好,但是当我使用 valgrind 时出现错误。
我已经以多种方式编写了此方法,但找不到修复它的方法。我贴出了我写过的最简洁的方法。
bool BinTree::insert(NodeData* s) {
Node* currentPtr = root;
bool insert = insertHelper(s, currentPtr);
return insert;
};
bool BinTree::insertHelper(NodeData* s, Node*& currentPtr) {
if (currentPtr == NULL) {
Node* newNodePtr = new Node;
newNodePtr->data = s;
newNodePtr->left = NULL;
newNodePtr->right = NULL;
currentPtr = newNodePtr;
return true;
} else if (*s == *currentPtr->data) {
return false;
} else if (*s < (*currentPtr->data)) {
return insertHelper(s, currentPtr->left);
} else {
return insertHelper(s, currentPtr->right);
}
}
由于类似的错误,我的程序中出现大量内存泄漏。
或者,有人能解释一下指针引用背后的概念,或者了解更多关于它的方法吗?
这个方法使用的方法:
void buildTree(BinTree& T, ifstream& infile) {
string s;
for (;;) {
infile >> s;
cout << s << ' ';
if (s == "$$") break; // at end of one line
if (infile.eof()) break; // no more lines of data
NodeData* ptr = new NodeData(s); // NodeData constructor takes string
// would do a setData if there were more than a string
bool success = T.insert(ptr);
if (!success)
delete ptr; // duplicate case, not inserted
}
}
【问题讨论】:
-
究竟显示了什么错误?如何删除树的节点?当您忘记释放内存(使用 orerator delete)时,通常会发生内存泄漏
-
在
insert()内,变量currentPtr具有自动存储持续时间,因此在函数返回时不再存在。让它指向某个东西(通过将它传递给insertHelper(),这在某些情况下会在您的代码中改变它)并不会改变它。 -
Sandro,我们的任务不包括删除操作符。我将包括我的教授编写的使用插入的方法。
-
Peter,如果我只使用 root 作为参数而不是 currentPtr,我会得到更多的内存泄漏。
-
第一个目标是让程序正常工作,如果程序停止执行它应该做的事情,更少的内存泄漏并不是一件好事。
标签: c++ pointers memory-leaks reference