来自引用指针的内存泄漏

Memory Leak from Referenced Pointer

本文关键字:内存 泄漏 指针 自引用      更新时间:2023-10-16

我正在学习引用指针和内存泄漏。

我创建了一个方法,该方法接收指向 NodeData 的指针,创建一个包含 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;
};

代码修改的是局部变量,而不是根变量。

如果要修改根,则需要对根的引用

,而不是对具有根副本的局部变量的引用。