2011-01-25 3 views
6

새로운 클래스를 오버로드하고 삭제합니다 (이러한 메모리를 가져 와서 메모리 풀로 반환합니다). 나에게 실망스러운 점은, 오버로드 된 클래스가 delete 오버로드 된 함수 get이 호출되기 전에 호출 된 소멸자를 가지고 있다는 것입니다. 이걸 어떻게 막을 수 있니?호출중인 소멸자가 중지되었습니다.

class Message 
{ 
    ~Message() { ... } 

    void* operator new(std::size_t sz) { ... } 
    void operator delete(void* ptr) { ... } 
}; 

편집 : 클래스의 멤버가 파괴되지만 메모리가 소멸자에 의해 해제되지 않습니다 생각에서 올바른

암; delete 함수는이 책임을 가지고있어서 어떤 경우에 메모리가 할당 해제되는 것을 막을 수 있습니까?

결과 : 페니 (Penny)는 메모리 및 구조/파괴의 할당/할당 해제가 별도의 항목임을 유의했습니다. 이제 비어있는 소멸자가 생겨서 새로운/과부하가 오버로드되었습니다.

+2

나는 그것이 왜 절망적인지 모르겠다. C++은 이와 관련하여 매우 논리적입니다. 아무것도 할 필요가 없다면 빈 소멸자를 남겨주세요. –

답변

6

파괴와 할당 해제는 직각의 두 가지이며, 다른 하나는 억제해서는 안됩니다. 스택에 생성 된 클래스의 인스턴스로 무엇을 할 것입니까? 자원을 정리하지 않습니까? RAII이라는 매우 유용한 개념을 깨려고합니다. 당신이 (가) 특정 풀에서 메모리를 잡아와 (b) 소멸자가 하나 개의 옵션 호출 될 때 제어에 대한 염려되는 경우

4

소멸자가 호출되는 것을 방지 할 수 있다고 생각하지 않습니다. 왜 내가 원하는지 확실하지 않습니다. 메모리가 해제되기 전에 객체를 파괴해야합니다. 수퍼 클래스가 리소스를 할당 한 경우 소멸자는 객체의 메모리가 해제되기 전에 해제해야합니다.

편집 후 편집 : 예, 소멸자는 할당 된 모든 내용을 정리하지만 개체의 메모리를 할당 해제하지 않습니다. 당신이 쓰는 방법은 delete입니다.

안녕, 멋진 이름. :-)

3

placement new입니다 :

void* raw = allocate(sizeof(Foo)); // line 1 
Foo* p = new(raw) Foo();   // line 2 

p->~Foo(); // explicitely call destructor 

(코드는 C로 링크 위에서 찍은 ++ FAQ)

0

새 생성/삭제 여부에 관계없이 네 생성자 및 소멸자가 호출됩니다.

물어 보지 않은 질문에 답하면 메모리 풀이있는 개체를 사용하는 좋은 해결책인지 여부에 대한 대답은 일반적으로 "아니오"입니다. 원하는 것은 클래스이며 allocator 클래스를 취하기 위해 메모리 풀을 사용한다. 이것은 훨씬 더 많은 유연성을 허용하며 일반적으로 클래스를 하나만 가지지 않고 메모리 풀에 넣을 수있는 클래스가 많기 때문에 모든 새로운/삭제 함수가 대량 오버로드되는 것을 원하지는 않습니다. 또한 여러 가지 할당 체계 (따라서 할당 자)를 갖는 것도 드문 일이 아니지만 새로/삭제를 한 번만 오버로드 할 수 있습니다.

+0

질문 답변 : C++에서 소멸자를 호출하지 못하게하는 방법은 무엇입니까? 이것은 할당을 위해 새로운 배치를 사용하려는 경우에만 수행 할 수 있습니다.이 경우 개발자 (프로그래머)는 수동으로 소멸자를 호출해야합니다 (Doug는 다음과 같이 말했습니다 : p-> ~ Foo :: Foo() ;). 이것은 프로그래머가 소멸자를 수동으로 호출해야하는 언어의 유일한 인스턴스입니다. – Viren

관련 문제