2016-10-30 20 views
20

私は動的に割り当てられたオブジェクト内のラムダへのポインタを格納しています:ラムダを削除する必要がありますか?

struct Function { 
    SomeType*(*func)(int); 
    Function(SomeType*(*new_func)(int)): 
     func(new_func) {} 
} 

Function* myf = new Function(
    [](int x){ return doSomething(x); } 
); 

delete myf; 

が、私はこのクラスのデストラクタに特別な何かを書くことはありますか?

+10

1つの発言 - なぜ 'new'と' delete'の代わりに 'unique_ptr'や' shared_ptr'を使わないのですか? –

+1

デストラクタで特別なことを書かなければならないと思われるのはなぜですか? – user2079303

+0

何かがポインタであるという事実だけでは、それを削除する必要はありません。 –

答えて

13

いいえ、特別な操作は必要ありません。この場合(ラムダを関数ポインタに変換しています)、これはdoSomethingのどちらかを削除する必要はないということと同じです。

より一般的には、lambdasはデフォルトコンストラクタが削除された名前のない型です。つまり、コピー/移動によって新しい式で明示的に作成することしかできません。その場合はdeleteに電話する必要があります。

N4140 5.1.2 [expr.prim.lambda]/20

ラムダ式に関連付けられている閉鎖型削除 デフォルトコンストラクタ、削除、コピー代入演算子を有しています。

+0

関数ポインタに変換するのではなく、ラムダオブジェクト自体を保存するとどうなりますか? https://pastebin.com/GJCkKjxY – Alexander

4

あなたのクラスがするはずのことを知らずに、デストラクタが何をすべきかどうかを教えてもらえません。

クラスがダイナミックメモリ(newまたはmalloc [malloc]を使用しないで)を直接割り当てる場合、そのメモリの割り当てを解除する方法を検討する必要があります。同様に、クラスがファイルポインタなどの他のリソースを取得する場合、それらのリソースを解放する方法を検討する必要があります。典型的には、これを行う適切な場所はデストラクタです。

自分自身に質問してください:クラスは直接動的メモリを割り当てますか、外部リソースを取得しますか?答えは次のように見える:いいえ、そうではありません。したがって、特にデストラクタの本体で明示的に行われるべきものは何もないように見えます。

関連する問題