c++ - 引用指针的内存泄漏

标签 c++ pointers memory-leaks reference

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

我创建了一个方法,它接受一个指向 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/

相关文章:

c++ - 可能存在内存泄漏 : new char[strlen()]

c++ - umdh:释放在哪里,什么是负分配?

python - 可以直接从 gpu 给 Caffe 或 Caffe2 输入数据吗?

c++ - 模拟 Keep Alive 信号

c - 指针指向指针的正确用法

C++:如何分配和填充通过引用传递的结构的动态数组?

android - 在 Android Studio 中使用 Processing 会导致内存泄漏

c++ - 在 C++ 中链接 cURL

c++ - 工厂设计模式替代方案: classes with different constructors

c - 为什么 #define NUM_EMPLOYEES 20;使用时给出语法错误?