2014-12-06 1 views
-3

C++ : 클래스 소멸자는 무엇을합니까? 다음과 같이 가정하자C++ : 클래스 소멸자는 무엇을합니까?

우리는 여러 회원 대상 "인 myObject"을 가지고 있고,이 : 내가 읽은 바로는

int a; 
float b; 
yourClass yourObject; 
void hisMethod(); 

가, 메모리가 "인 myObject"에하는 순서와 같다 할당.

일단 소멸자가 호출되면 어떻게됩니까?

소멸자가 호출 된 후 객체가 파괴되기 전에 내가 읽은 것으로부터 (a) 객체 "myObject"에 액세스 할 수 있습니다. (b) yourObject (c) members hisMethod()

계좌에 대한 아직 액세스 할 수 있습니까? 정의되지 않은 동작입니까?

많은 C++ 서적에서 자세한 내용을 언급하지 않습니다. 자세한 내용은 어디에서 확인할 수 있습니까? 왜냐하면 세부 사항은 "배치 후 새로운 것이 아니라면 수동으로 소멸자를 호출하지 않는 것"과 같은 많은 C++ 규칙을 이해하는 데 도움이 될 수 있기 때문입니다. 나는이 글을 보았 기 때문에

[업데이트 1] 내 질문을 제기 : What does empty destructor do? 포스터는 아래 예제를 제공합니다

#include <iostream> 
#include <set> 


class a 
{ 
public: 
std::set <int> myset; 
}; 

int main() 
{ 
a object; 
object.myset.insert(55); 
object.~a(); 
object.myset.insert(20); 
std::cout << object.myset.size(); 
} 

포스터 얻을 : "* glibc는 *이 감지 /합니다. app : double free or corruption (fasttop) : "그리고 나서"ABORT ".

이 의미

object.myset.insert(20); 

가 소멸자를 수동으로 호출 한 후 존재 여전히 개체를 의미 오류를 발생시키지 않습니다. 해당 클래스 멤버를 계속 호출 할 수 있습니다!

deconstructor를 두 번 호출하면 오류가 발생합니다.

[업데이트 1] QT Creator에서 코드를 실행하고 object.myset.insert (20)를 실행할 때;

이 오류가 발생 : 플래그 =이 0x0, 0x0으로 :

는에서 액세스 위반을 참조하십시오.

+0

dtor를 호출하면 개체 수명이 종료됩니다. 그것으로 아무 것도하지 마십시오. – Deduplicator

+0

* "소멸자가 호출 된 후 객체가 파괴되기 전에"* - 그게 무슨 뜻입니까? 정의에 따라 소멸자는 객체를 파괴합니다. – 5gon12eder

+0

@Deduplicator. 나는 그 규칙을 알았다. 난 그저 기본 메커니즘을 이해하고 싶었어요. – user1914692

답변

0

yourClass yourObject;의 경우, 컴파일러가 실행되기 전에 컴파일러에서 불평 할 것이기 때문에 사용자는 파괴 된 후
에 액세스 할 수 없습니다.
이 경우 (자동 저장 기간) 범위는 객체의 수명이므로 파괴 된 후에는 yourObject가 더 이상 알 수없는 코드 부분에 있습니다.

(소멸자와 실제 메모리 해제 은 각각입니다. 그러나 두 코드 사이에 코드를 넣지 않아도 연속적으로 발생합니다.) 당신은 몇 가지 포인터가있는 경우

new 뭔가를 할당하고, delete을 :
이 예, delete 후 액세스 할 정의되지 않은 동작을 키우면.

0

클래스 소멸자, 즉 ~ class라는 메소드는 사용자가 요청한대로 수행합니다. 메모리를 해제하지 않습니다.

소멸자가 개체를 파기하는 과정의 일부로 호출되는 경우이 프로세스는 일반적으로 소멸자가 실행 된 후에 개체와 연결된 메모리를 해제합니다. 스택에

  • 메모리가 암시가 해제하여 해제 될 힙에 StackFrame을 포인터 업데이트
  • 에 의해 해제 : 어디 개체가 서로 다른 만든 방법에 따라 메모리 '해제'는 일어날 것이다 힙에 메모리를 다시
  • 실제로 메모리가 공개되지 않습니다.
+0

소멸자가 수동으로 호출 된 후 이것이 의미하는 바는 우리가 메모리에 그러한 변수가 없으므로 더 이상 객체입니까? 또는 우리는 여전히 객체를 참조 할 수 있습니다. 정의되지 않은 동작이 발생합니까? – user1914692

+0

@ user1914692 예, 여전히 "이름"을 사용할 수있는 경우, 예. 현재 범위에 포함되어 있으므로 액세스 할 수 있습니다. 그러나 "단지"비 순발적 인 행동은 프로그램을 망칠 수있는 "그냥"문제가있는 오류이므로 그렇게하지 마십시오. – deviantfan