2011-11-03 1 views
-1

3 개의 노드 포인터와 2 개의 정수가 포함 된 노드 클래스가 있습니다. 모든 노드를 new으로 할당하지만, delete을 호출하면 정수가 -17891602으로 설정되고 나머지 코드의 경계 검사가 엉망이됩니다. delete이 무엇을 할 수 있습니까?내 클래스의 데이터 필드에 가비지 값을 남겨두기 위해 삭제되는 원인은 무엇입니까?

+1

코드를 공유 할 수 있습니까? – Avinash

+1

일부 코드를 보지 않아도 알기가 어렵습니다. 소멸자에 버그가 있습니까? –

+0

메모리 내용을'delete '한 후에 메모리 내용을 확인하는 이유는 무엇입니까? 'delete '를 호출 한 후에 메모리에 액세스하는 것과 같은 실수를 탐지하는 데 도움을주기 위해 의도적으로 특정 쓰레기를 작성합니다. –

답변

5

delete 이후에는 더 이상 기억력이 흐려지지 않습니다. 그것을 검사하지 마십시오. 아무 것도하지 마십시오. 그렇게하면 정의되지 않은 행동이 생깁니다. 곧 재사용 될 것입니다.

건배 & HTH. 포인터 필드는 새 값을 얻을 수 있는지

+0

디버그 빌드에 많은 컴파일러를 추가하면 해제하지 않아도되는 물건에 쉽게 액세스 할 수 있도록 해제 된 메모리에 고의로 쓰레기가 작성됩니다. –

+0

yemathum은 노드의 포인터 멤버를 삭제하면 정수 멤버가 변경된다고 말하고있는 것 같습니다. 그는 삭제 된 기억을 (그가 아는 ​​한) 검사하지 않고있다. –

0

확인합니다. 그것들은 0xfeeefeee와 같은가요? (이것은 16 진수로 -17891602입니다.) 메모리 관리자가 해제 된 메모리를 덮어 쓸 수 있으므로 더 이상 액세스하지 않아도되는 메모리를 읽거나 쓰려고 할 때 크래시 덤프에서 인식하기가 더 쉽습니다.

해제 된 개체를 읽고 경계 검사를 수행하는 경우 정의되지 않은 동작에 의존합니다. 사용 가능한 환경에 대한 문서를 참조하여 해제 된 메모리가 무엇인지 확인하십시오. 너의 범위 검사기는 그것과 협력해야 할 것이다; 일반적인 경우에는 작동한다고 가정 할 수 없습니다.

0

Linux에서 개발하고 gdb을 사용하는 경우 watch 명령을 GDB에 사용하여 감시 점을 지정할 수 있습니다. 이렇게하면 덮어 쓴 메모리 위치가 언제인지 파악하는 데 도움이됩니다.

관련 문제