0

warning C4355: 'this' : used in base member initializer listVisual C++ 2010 から取得します。

ハンドルを保持しているクラスがあり、クラスの ctor が失敗した場合でもハンドルを自動的に閉じたい(そのため、dtor は呼び出されません)。ただし、ハンドル ラッピング クラス全体をわざわざ作成したくはありません。むしろ、それをスマート ポインターに保持したいと考えています。そして、私はこれを書いた:

foo.h
~~~~~
class Foo
{
    ...
    Log &_log;
    std::unique_ptr<void, std::function<void (void *)>> _handle;
    ...
}

foo.cpp
~~~~~~~
#include <windows.h>
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)))たが、それには別の定義が必要です。

私の質問: 警告は、この特定のインスタンスに対する懸念事項ですか? いずれにせよ、詳細な理由は何ですか?それを回避する簡単な方法はありますか?

4

1 に答える 1

1

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

于 2011-06-15T02:59:31.043 に答える