2012-11-21 12 views
7
#include <new> 
#include <cstdlib> 
#include <iostream> 
#include <stdexcept> 

struct foo {}; 

inline void* operator new(size_t size, foo*) throw (std::bad_alloc) 
{ 
    std::cout << "my new " << size << std::endl; 
    return malloc(size); 
} 

inline void operator delete(void* p, foo*) throw() 
{ 
    std::cout << "my delete" << std::endl; 
    free(p); 
} 

int main() 
{ 
    delete new((foo*)NULL) foo; 
} 

出力(via ideone)のオーバーロード:新しいおよびオプションの引数をオペレータに削除

my new 1 

を私の思考は、C++は、そのマッチング同じ引数の削除と追加の引数でnew'dオブジェクトを解放するというものでした、私は明らかに間違っていた。

私のオーバーロードされた削除を呼び出す上記のコードを取得する正しい方法は何ですか?

+0

C++には配置-delete式はありませんが。手動でオブジェクトを破壊する必要があります。 –

答えて

8

std::nothrow_tバージョンを除いて、新しいプレースメントのフォームを使用する場合は、オブジェクトを明示的に破棄して、適切と思われる方法でそのオブジェクトを解放する必要があります。ただし、オーバーロードされたバージョンoperator delete()は、オブジェクトの構築が例外をスローする場合に使用されるため、依然として存在する必要があります。この場合、例外がスローされるため、ポインタは返されません。したがって、メモリを取り除くことは、この割り振りプロセスで行われることになります。

あなたmain()はこのようなものになるはずです:

int main() 
{ 
    foo* p = new (static_cast<foo*>(0)) foo; 
    p->~foo(); 
    operator delete(p, static_cast<foo*>(0)); 
} 
関連する問題