我正在学习引用指针和内存泄漏。
我创建了一个方法,它接受一个指向 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
}
}
最佳答案
你可能会更幸运一些
bool BinTree::insert(NodeData* s) {
bool insert = insertHelper(s, root);
return insert;
};
您的代码修改了局部变量,而不是根变量。
如果要修改根,则需要对根的引用,而不是对具有根拷贝的局部变量的引用。
关于c++ - 引用指针的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48361349/