3
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <cmath>

using namespace std;

template <class T>
class binary_node {
public:
    T data;
    binary_node<T> *left;
    binary_node<T> *right;

    binary_node(const T& data)
        :data(data), left(NULL), right(NULL) {
    }
};

int main() {
    binary_node<int>* node = new binary_node<int>(10);
    node->left = new binary_node<int>(1);
    node->right = new binary_node<int>(50);

    binary_node<int>* ptr = node->left;

    delete ptr;
    ptr = NULL;

    if (node->left == NULL) {
        cout << "????";
    }
    else {
        cout << node->left->data << endl;
    }   

    return 0;
}

我会期待node->left == NULL,但即使数据node->left是垃圾,结果也是完全出乎意料的。我正在使用 Visual C++ 2010,谁能帮我解释一下这种行为?

编辑
另一方面,它在遍历和删除节点时工作得很好,如下所示:

    ~linkedlist() {
#if DEBUG
        cout << "~linkedlist() called.\n";
#endif
        while (head != NULL) {
#if DEBUG
            cout << "delete node: " << head->data << '\n';
#endif
            node<T>* temp = head;
            head = head->next;
            delete temp;
            temp = NULL;
        }
    }
4

3 回答 3

9

您正在删除分配给node->left对象的数据,即。new binary_node<int>(50)对象。

但是,您正在通过另一个指针删除。然后你 NULL 那个其他指针

node->left 永远不会设置为 null。因此,它指向的任何内容(释放的内存)就是它所指向的内容。

试试这个:

binary_node<int>** ptr = &(node->left); 

delete *ptr; 
*ptr = NULL; 

或这个

delete node->left; 
node->left = NULL; 

这是我为说明我在说什么而做出的改进描述: 在此处输入图像描述

于 2012-06-02T06:31:59.070 回答
1

您必须设置node->lefttoNULL而不是ptrto NULL

delete不会传入的指针设置为NULL. 就算也改不了node->left

于 2012-06-02T06:30:05.317 回答
0

指针实际上只是一个数字。确定内存中位置的数字。您有两个指针指向内存中的同一位置:ptrnode->left. 然后删除内存并将其中一个指针重置为NULL,但这当然不会使另一个指针也被重置。

于 2012-06-02T06:41:25.387 回答