내 질문 :포인터와 동적 메모리 할당
int* x = new int;
cout << x<<"\n";
int* p;
cout << p <<"\n";
p = x;
delete p;
cout << p <<"\n";
내가 (도에서 분실) 동적 new
및 delete
을 포인터를 이해하고 이해하기 위해 자신 순전히이 썼다.
내 엑스 코드는 프로그램을 컴파일하고 다음과 같은 결과를 반환 할 수 있습니다
0x100104250
0x0
0x100104250
나는 동적으로 할당 된 메모리에서 삭제를 호출 할 수 있습니다 알고 있습니다. 그러나 위의 프로그램에서 p
에 대한 삭제를 호출하고 컴파일합니다.
아무에게도 설명 할 수 없습니까? p
을 삭제할 수있는 이유가 무엇인가요?
int* x = new int;
int* p;
cout << p <<"\n";
delete p;
cout << p <<"\n";
그럼 내 Xcode를 다시 컴파일하고 나를 반환 :.
0x0
0x0
Program ended with exit code: 0
지금, 나는 완전히 잃었다을 :(
또한, 나는 프로그램은 다음에 변경하는 경우 발견 아무도 내게 이것을 설명해 줄 수 없습니까? p
은 아무 것도 할 수 없기 때문에 왜 삭제할 수 있습니까? x
?
Xcode가 성공적으로 컴파일되므로 위의 두 프로그램이 컴퓨터에 적합하다고 가정합니다. 그러나 나는 다시 동적 할당 메모리에서만 호출 삭제라고 생각합니다. 또는 아마도 포인터가 무엇인지 동적 할당 메모리가 무엇인지 완전히 이해하지 못했습니다. 온라인에서 검색 할 때 post을 찾았습니다. 하지만 제 생각과 다르다고 생각합니다.
도와주세요.
나는 하나 더 질문하고 싶습니다. 이진 검색 트리에 대한 코드는 here입니다. 28 ~ 32 행에서 하나의 자식이있는 노드를 삭제하는 작업을 처리합니다. 웹 링크가 작동하지 않는 경우를 대비하여이 코드를 여기에 넣었습니다.
if (root-> left == NULL) { struct Node * temp = root; root = root-> right; 임시 직원 삭제; }
포인터를 묻는 질문은 위의 코드를 참조하십시오. 이 게시물의 답변에 이어 다음과 같은 방법으로 코드를 이해하는 것이 맞습니까?
root의 상위 노드를 root의 오른쪽 하위 노드로 먼저 연결할 수 없습니다. 루트 노드 아래의 하위 트리도 삭제되므로 루트 노드를 삭제하십시오. 그래서 임시 포인터를 만들어서 루트가 가리키는 메모리 슬롯을 가리켜 야합니다. 그런 다음 루트의 부모 노드를 루트의 하위 노드에 연결합니다. 이제 "root"로 지정된 메모리 슬롯 (즉, 둘 다 동일한 메모리를 가리키는 temp)을 안전하게 삭제할 수 있습니다. 이렇게하면 메모리를 해제하고 부모와 자식 간의 연결을 유지합니다. 또한 임시 메모리가 여전히 있으며 "여전히"메모리 슬롯을 가리 킵니다. 삭제 후 NULL로 설정해야합니까?
다시 한번 감사드립니다.
Yaofeng
두 번째 코드 샘플에서'p'가'0' 인 것은 "행운"입니다. 초기화되지 않았기 때문에 어떤 값을 가질 수 있습니다. '0' (일명'NULL')이므로'delete'를 호출하는 것이 유효합니다 (특히 할당이 실패한 오류 조건을 처리 할 때'NULL '에 대한 백만 가지 검사를 피하는 것이 유용합니다. 나머지 할당 정리 - 만약 모든 포인터가 처음에'NULL'으로 초기화된다면, 할당하지 못한 것을 걱정하지 않고 모든 것을'삭제 '만 할 수 있습니다.) –
조언 만하면 int * p = 0과 같이 포인터 변수를 항상 초기화해야합니다. 또는 int * p = NULL; 이것은 디버그 빌드에서이 작업이 수행되기 때문입니다. 그러나 릴리스 빌드에서는 완료되지 않습니다. 이렇게하면 디버깅에 많은 시간을 절약 할 수 있습니다. – user743414
@ user743414 레거시 코드를 유지하지 않는다면 C++ 11을 사용해야하고 따라서'int * p = nullptr;'을 사용해야합니다. (이 부분) C++ 11은 수년간 모든 주요 컴파일러에서 지원되었습니다. – Angew