2012-03-31 2 views
8

C++ 클래스의 기본 소멸자가 코드에 명시 적으로 할당되지 않은 멤버를 자동으로 삭제합니까? 예 :기본 소멸자가 수행하는 작업

class C { 
    public: 
    C() {} 
    int arr[100]; 
}; 

int main(void) { 
    C* myC = new C(); 
    delete myC; 
    return 0; 
} 

myC의 arr이 자동으로 할당 취소됩니까? 아니면 명시 적으로 C의 소멸자를 써야합니까?

+2

http://www.parashift.com/c++-faq-lite/dtors.html – Anycorn

+0

배열을 자동으로 삭제합니다. – JosephH

답변

5

생성자 (ctor-initializer-list이없는 경우)는 각 하위 개체에 대한 기본 생성자를 호출합니다.

기본 클래스가없고 멤버 변수가 기본 유형이기 때문에 아무 것도 수행하지 않습니다.

소멸자와 동일합니다. 당신은 선언하지 않았기 때문에 암시 적으로 컴파일러에서 생성되며, 각 하위 객체에 대한 소멸자가 호출됩니다. 당신의 유일한 하위 객체가 프리미티브의 집합체이기 때문에 이것은 또한 사소한 것입니다.

이제 클래스의 모든 메모리는 삭제할 때 해제됩니다. 배열은 클래스 안에 내장되어 있으므로 동일한 메모리 영역의 일부이며 동시에 해제됩니다.

+0

@Mark : 소멸자는 오버로드 될 수 없기 때문에 "기본"구분이 없습니다. –

+0

@Mark : 문제 없습니다. –

+0

"하위 개체"는 "데이터 멤버"를 의미합니다. –

5

암시 적으로 정의 된 (기본값) 소멸자는 각 구성원에 대해 소멸자를 호출합니다. 멤버 배열의 경우 배열의 각 요소에 대해 소멸자를 호출합니다.

포인터에는 소멸자가 없습니다. 수동으로 삭제해야합니다. 제공된 예제에서이 문제가 발생하지 않지만 인식해야 할 사항입니다.

+1

포인터는 소멸자 ([here here] 참조) (http://ideone.com/97iUx)를 가지고 있지만 분명히 가리키는 것을 삭제하지는 않습니다. – Pubby

+0

기다려 ... 당신은 포인터가 소멸자가 없다고 말하지만, 삭제는 포인터 만 사용한다고 생각합니다. 당신은 디폴트 소멸자가 배열의 100 int마다 delete를 호출한다고 말하고 있는가? – Robz

+0

@Robz, 아니요. 암시 적 소멸자 *가 delete를 호출하지 않는다고 말하고 있습니다. 멤버로 원시 포인터가 있으면 명시 적 소멸자에서 직접 처리해야합니다. –

5

클래스/구조체에 포인터가 포함되어 있고 참조 할 포인터에 명시 적으로 할당하면 보통 delete을 dtor에 써야합니다. 클래스/구조체에 직접 포함 된 멤버는 자동으로 만들어지고 파괴됩니다.

class X { 
    int x; 
    int *y; 
public: 
    X() : y(new int) {} 
    ~X() : { delete y; }  
}; 

여기에서 X :: x는 자동으로 생성/파괴됩니다. X :: y (또는 기술적으로 올바르므로 X :: y가 가리키는 점은 그렇지 않습니다.) 우리는 그것을 ctor에 할당하고 dtor에서 파기합니다.

+0

'X :: y'는 자동적으로 파괴됩니다. 소멸자가 아니면 누설 될'* (X :: y)'입니다. (그리고 샘플은 규칙 3/4/5를 깨뜨 렸습니다.) –

+0

@BenVoigt : 네, 문제는 소멸자가하는 일에 관한 것이지, 리모트 소유권을 올바르게 처리하는 클래스를 쓰는 방법에 관한 것이 아닙니다. –

0

새로 전화를 걸면 반드시 해당 삭제가 있어야합니다. 새 인스턴스를 호출하여 무언가 인스턴스를 만들지 않았다면 삭제를 호출 할 필요가 없습니다.

+0

IMHO, 애플리케이션 코드에서 아무것도 삭제하지 말고 엄격한 소유권을 설정하거나 모든 구성원에 대한 구성원의 의미론 (semantics of semantics) 속임수. 그것이 실패하면 스마트 포인터가 수동 포인터와'delete'에 대한 더 나은 대안이 될 수 있습니다. – Rawler

-1

소멸자를 쓸 필요가 없습니다. C++ 클래스에는 'return 0'다음에 객체를 삭제하여 메모리를 재활용하는 기본 소멸자가 있습니다.

관련 문제