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->leftVisual 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

ポインタは実際には単なる数字です。記憶の場所を決める数字。メモリ内の同じ場所を指す 2 つのポインタがあります:ptrnode->left. 次に、メモリを削除し、ポインターの1つを にリセットしますNULLが、もちろん、他のポインターもリセットされるわけではありません。

于 2012-06-02T06:41:25.387 に答える