#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;
}
}
당신이'delete '를 호출 한 후에'ptr'은 실제로 아무 것도 가리 키지 않으므로'NULL'로 설정하면'node-> left'에 영향을 미치지 않습니다. – Cyclonecode
'ptr '은'node-> left'에 저장된 포인터의 복사본 일 뿐이며'node-> left'는 변경되지 않습니다. 'binary_node * & ptr = node-> left;는 예상대로 작동합니다. –
DCoder
목록 순회가 다릅니다. 'head'를 다른 값으로 설정하고, 아마도 마지막 요소의'next' 노드가 다른 곳의 NULL로 설정되었을 것입니다. – juanchopanza