2011-11-10 17 views
3

delete ptrAddr;boost::function0にマップする必要がありますが、削除するためにいくつか問題があります。無料でうまく動作します。問題はstd::ptr_fun(operator delete)のように見えますが、ヘルパーファンクタを書かずにこの作業を行う方法を理解できません。boost :: bindとdelete

boost::function0<void> Function; 
Function = boost::bind(std::ptr_fun(free), (void*)malloc_string); //this works 
Function = boost::bind(std::ptr_fun(operator delete), (void*)new_string); //doesn't work 
Function(); //call function 
+0

がありますユーザー定義の型を扱うときにこのポインタを隠します。また、割り当てられたメモリを削除する前にデストラクタを呼び出します。 'std :: default_delete 'に言及するには、new/deleteをmalloc/freeと一緒に使用しないでください。 – sarat

答えて

11

あなたはBoost.Lambdaからdelete_ptrを使用することができます:C++ 11では

boost::bind(boost::delete_ptr(), new_string); 

、あなたがstd::default_delete<T>を使用することができます。

std::bind(std::default_delete<decltype(new_string)>(), new_string); 

それとも、ラムダ:

[new_string]() { delete new_string; } 
+2

+1。 –

+0

'delete_ptr'を使うために' new_ptr'を使って割り当てを行うべきですか? – cprogrammer

+0

@cprogrammer:いいえ、 'new_ptr'は' new T(args) 'を使うように定義され、' delete_ptr'は 'delete T'を使うように定義されています。 –

4

delete p;は関数呼び出しではありません。 の式です。あなたが望むものは意味をなさない。

無料の関数::operator delete()がありますが、それはあなたの考えをしません。

標準ライブラリコンテナ(キーワード:アロケータ)の実装、またはstd::unique_ptrを調べて、カスタマイズ可能なオブジェクトの削除をどのように処理するかを確認してください。


小片に分解代表的な構成/破壊シーケンスは次のようになりますステップ〜第

void * addr = ::operator new(sizeof(T)); // allocation 

T * p = ::new (addr) T;     // construction 

p->~T();         // destruction 

::operator delete(addr);     // deallocation 

最終delete p;に対応しながら、発現T * p = new T;に道徳的に等価です。しかし、newを経由する以外のコンストラクタを呼び出す方法はありません。あなたは、デストラクタを何らかの方法で呼び出すことを忘れてはなりません。

関連する問題