2009-09-08 3 views
0

boost.pool을 사용하고 싶습니다. 당신이 그것에 대해 모른다면 괜찮습니다. 기본적으로 malloc()과 free()의 두 가지 주요 함수가 있습니다.오버로드 된 삭제하기 전에 소멸자를 호출하지 못하게 할 수 있습니까?

사용자 정의 클래스 테스트를 위해 new 및 delete를 오버로드했습니다.

class test 
{ 
public: 

    test() 
    { 
     cout << "ctor" << endl; 
    } 

    ~test() 
    { 
     cout << "dtor" << endl; 
    } 

    void* operator new(size_t) throw() 
    { 
     cout << "custom operator new" << endl; 
     return _pool.malloc(); 
    } 

    void operator delete(void* p) 
    { 
     cout << "custom operator delete" << endl; 
     _pool.free(p); 
    } 

    void show() 
    { 
     cout << _i << endl; 
    } 

private: 
    int _i; 
    static boost::pool<> _pool; 
};// class test 

boost::pool<> test::_pool(sizeof(test)); 

나는 새로운 사용하여 테스트의 인스턴스를 생성

는 생성자가 호출되지 않았습니다하지만 난 그것을 삭제하면, 소멸자 라는이었다. 왜? 내가 그것을 피할 수 있을까요?

+2

당신이 '시험'에 – MSalters

+4

귀하의 소멸자 이름 '윤'의 발행 수의 절반을 변경 보인다 클래스 이름과 일치하지 않습니다. 실제 코드를 보여주십시오. – dave4420

+2

윤이 테스트로 바뀌고 메인 테스트를 추가했을 때 * p = new test; p를 삭제하고, 출력은 "custom new/ctor/dtor/custom delete"입니다. 완전하고 컴파일 가능한 예가 필요합니다. – UncleBens

답변

1

이, 재현 할 수 및

int main() 
{ 
    test* p = new test; 
    delete p; 
} 

(사람들이 코드를 컴파일?! 만들 필요 같은 것을 생략 않는 이유) 이것은 좀더 단순화 중 하나입니다 다운되고 수정 된 버전이 없거나 컴파일러가 손상되었을 수 있습니다. (어떤 버전입니까?)

어떤 경우 든 당신의 목표는 이어야합니다. 소멸자가 호출되지 않고 오히려입니다. 오버로드 된 연산자 new는 원시 메모리 할당을 처리하기 만하면 내장 된 새 표현식이이를 사용하여 메모리를 얻은 다음 생성자를 호출하여 인스턴스를 만듭니다.

편집 : 나는 당신의 출력을 재현 할 수있는 유일한 방법은 우회하는 것입니다 내장 된 새로운 표현 :

test* p = static_cast<test*>(test::operator new(sizeof (test))); 
0

글로벌 연산자 new가 호출 되었기 때문일 수 있습니까? 어쨌든, 삭제

운영자 새로운 연산자 클래스에 대한 단지 주석이 ... 항상 정적 (당신이 키워드를 작성하지 않은 경우에도), 그래서 선언에 정적를 사용하는 것이 좋습니다.

operator new를 throw()로 선언 했으므로 throw되지 않습니다. 그러나 당신은 던질 수있는 진술 (iostreaming)을 사용합니다. 어쩌면 당신은 try/catch로 그것을 둘러싸고 std::nothrow_t 버전을 생성해야합니다.

#include <iostream> 
#include <boost/pool/pool.hpp> 
using namespace std; 

을 추가 할 때

관련 문제