初期化子リストのクロージャー削除(C ++ 0x)およびコンパイラーの警告

c++11 closures initializer-list shared-ptr unique-ptr
初期化子リストのクロージャー削除(C ++ 0x)およびコンパイラーの警告

Visual C ++ 2010から「警告C4355: ‘this’:base member initializer listで使用されます」というメッセージが表示されます。

ハンドルを保持するクラスがあり、クラスのctorが失敗した場合でも(そのdtorが呼び出されない場合)、ハンドルを自動的に閉じたいと思います。 ただし、ハンドルラップクラス全体を作成するのは面倒であり、スマートポインタで保持する必要があります。 そして、私はこれを書いた:

foo.h
~~~~~
class Foo
{
    ...
    Log &_log;
    std::unique_ptr> _handle;
    ...
}

foo.cpp
~~~~~~~
#include
Foo::Foo(Log &lg, ...) : _log(lg), ... _handle(nullptr, [&](void *h){ if (h) { if (!CloseHandle(h)) LOG(_log, "Could not close port: " << LastWinErr()); h = nullptr; } })
{
    HANDLE h(CreateFile( ...
    if (h == ...
    _handle.reset(h);
    ... // Bunch of other stuff that could potentially throw
}
クロージャの前に、私は_handleを `_handle(nullptr、bind(PortDeleter、placeholders

_ 1、ref(_log)))`のようなもので初期化していましたが、それには別の定義が必要です。

私の質問:警告はこの特定のインスタンスの懸念ですか? どちらにしても、詳細な理由は何ですか? それを避ける簡単な方法はありますか?

  0  0


ベストアンサー

短いのは、「this」ポインターを渡し、初期化リストまたはデストラクタのメンバー関数または変数へのアクセスに使用する場合、Bad Things Happen™です。 それが起こらないことがわかっている場合は、警告を無視してください。 もちろん、それは良い警告でもあります-デストラクタでアクセスする関数または変数のいずれかがクラスに属している場合、構築前/破棄後にそれらにアクセスする可能性があるため、これは安全ではありません。 初期化/破壊の順序を知っている場合、問題は重大ではありませんが、メンテナンスがせいぜい面倒なため、一般的に悪い動きです。 代わりにコンストラクターパラメーターをキャプチャできるため、それを推奨する必要があります。

1


タイトルとURLをコピーしました