2017-05-04 1 views
1

나는 클래스와 메모리 해제에 미치는 영향의 소멸자 함수의 동작을 분석하기 위해 쓴, 그러나 결과는 나에게 조금 놀라운 것 같다 :기본 소멸자 V.S. 단순히 정의 소멸자

class test { 
public: 
    test() {} 
    ~test() {} //<-----Run the program once with and once without this line. 
}; 

int main() 
{ 
    test x; 
    test *a(&x); 
    cout << "a before memory allocation: " << a << endl; 
    a = new test; 
    cout << "a after memory allocation and before delete: " << a << endl; 
    delete a; 
    cout << "a after delete: " << a << endl; 

    return 0; 
} 

기본 소멸자와 함께 결과는 다음과 같습니다. enter image description here 내 자신의 소멸자가 있습니다 : enter image description here 두 번째 결과가 잘못 되었습니까?

할당 해제 기능이 잘못 할당이 해제 된 저장의 일부를 참조하는 모든 포인터를 렌더링 포인터, 에 의해 참조되는 스토리지를 할당 해제한다 어딘가에 내가 읽어 보시기 때문입니다.

어쩌면 나는 그것을 정확하게 따르지 않을 것입니다 (특히 어려운 영어 단어가 사용 되었기 때문에!). 이 일이 왜 일어 났는지 설명해 주시겠습니까? 정확히 정의 된 소멸자와 C++ 기본 소멸자의 차이점은 무엇입니까? 미리 도움을 주셔서 감사합니다. a가 객체에 (null이 아닌) 포인터 인 경우

+1

포인터가 동일하게 유지된다는 사실은 저장소가 할당 해제된다는 사실과 상충되지 않습니다. 이것은 재사용 될 수있는 메모리이며 방금 삭제 한 포인터를 사용하여이 메모리에 액세스하는 것은 자신의 잘못입니다. – Gerriet

+0

@Gerriet 예를 들어 주시겠습니까? 고맙습니다. –

+0

기본 소멸자로 포인터 수정을 재현 할 수 없습니다. http://ideone.com/vg3TYD – UnholySheep

답변

2

는 다음 작업을 delete aa가 (기본 소멸자 또는 특정 일)을 가리키는되는 개체의 소멸자를 트리거 마지막으로했던 메모리를 해제 이 객체에 할당됩니다. a이 가리킨 메모리가 더 이상 유효한 개체가 아니며 a을 더 이상 참조 해제하지 않아야합니다. 그러나 delete a은 포인터 a의 값을 다시 특정 값으로 설정하지 않습니다. 실제로 delete a이 (가) a 값을 변경 한 것에 놀랐습니다. 이 동작을 재현 할 수 없습니다.

+1

Visual Studio와 같은 일부 컴파일러는 디버그 모드에 대해 잘못된 값의 역 참조를 식별하는 데 도움이되도록 포인터를 잘못된 값으로 설정합니다. – Curg