引用指针的内存泄漏

时间:2018-01-20 21:36:30

标签: c++ pointers memory-leaks reference

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

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

1 个答案:

答案 0 :(得分:0)

你可能会有更多运气

bool BinTree::insert(NodeData* s) {
    bool insert = insertHelper(s, root);
    return insert;
};

您的代码修改了一个局部变量,而不是根。

如果要修改根,则需要引用根,而不是具有根副本的本地变量。