#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;
}
}
答案 0 :(得分:9)
您正在删除分配给node->left
对象的数据,即。 new binary_node<int>(50)
对象。
但是你要通过另一个指针删除。然后你用其他指针NULL
node-&gt; left永远不会设置为null。因此,无论它指向的内容(解除分配的内存)都是它指向的内容。
试试这个:
binary_node<int>** ptr = &(node->left);
delete *ptr;
*ptr = NULL;
或者这个
delete node->left;
node->left = NULL;
这是一个改进的描述,我用来表明我在说什么:
答案 1 :(得分:1)
您必须将node->left
设置为NULL
而不是ptr
设置为NULL
。
delete
不将指针传递给NULL
。即使如果,它也无法修改node->left
答案 2 :(得分:0)
指针实际上只是一个数字。确定内存中某个位置的数字。你有两个指针指向内存中的同一个地方:ptr
和node->left
。然后你删除内存并将其中一个指针重置为NULL
,但当然不也会使另一个指针重置。