我正在学习引用指针和内存泄漏。
我创建了一个方法,它接收一个指向NodeData的指针,创建一个包含NodeData的Node,一个左指针和一个右指针,并根据它的值插入它。我正在使用引用指针来遍历我的树。每次我声明一个新的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
}
}
答案 0 :(得分:0)
你可能会有更多运气
bool BinTree::insert(NodeData* s) {
bool insert = insertHelper(s, root);
return insert;
};
您的代码修改了一个局部变量,而不是根。
如果要修改根,则需要引用根,而不是具有根副本的本地变量。