2014-11-01 3 views
-2

동적 할당을 사용하여 포인터로 개체를 만드는 방법을 연구하고있었습니다. 그리고 나는 한 번 객체가 생성되고 두 번 삭제되면 힙 메모리가 손상된다는 것을 읽습니다. 무엇이 손상된 것입니까? 메모리 누수와 비슷하거나 다른 것입니까?포인터 개체를 삭제하면 힙 메모리가 손상됩니다.

int main() 
{ 
    //consider my class name is sample 
    sample *p= new sample; 
    //some code 
    delete p; 
    //some code 
    delete p; 
} 

p를 처음으로 삭제하면 p가 가리키는 메모리가 지워지고 힙으로 안전하게 반환됩니다. 다음에 어떤 일이 일어날까요?

답변

1

무료 저장소는 무료 및 할당 된 블록을 신중하게 관리하는 시스템이며 new 및 delete는 모든 것을 일관된 상태로 유지하기 위해 부기를 수행합니다. 다시 삭제하면 시스템에서 유효하지 않은 데이터에 대해 동일한 부기를 수행하고 갑자기 무료 저장소가 일관성없는 상태가됩니다. 이를 "힙 손상"이라고합니다.

그렇게되면, 당신은 새와 함께 할 또는 응용 프로그램의 메모리 영역 외부에 쓰기를 시도 데이터를 손상, 잘못 메모리를 더 이상 없다 생각, 또는 할당을 중복 포함 할 수있는 예측할 수 결과가있을 수 있습니다 삭제 아무것도.

세이프티 베팅은 삭제 후 포인터를 항상 null로 설정합니다.

int *ptr = new int; 
// do something 
delete ptr; 
ptr = null; 
+0

은 'null'대신 'nullptr'을 제안합니다. nullptr의 삭제가 표준에 의해 명시 적으로 effetct가없는 것으로 지원되기 때문에 확실히 안전합니다. – Christophe

관련 문제