我从Visual C ++ 2010获得warning C4355: 'this' : used in base member initializer list
:
我有一个持有句柄的类,我想自动关闭句柄,即使该类的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(nullptr, bind(PortDeleter, placeholders::_1, ref(_log)))
之类的东西初始化_handle,但这需要一个单独的定义。
我的问题:对于这个特定情况,警告是否是一个问题?无论哪种方式,具体原因是什么?是否有一种避免它的微不足道的方法?
答案 0 :(得分:1)
简而言之,如果您传递this
指针并且它用于访问初始化列表或析构函数中的成员函数或变量,Bad Things Happen™。如果您知道这不会发生,那么请随意忽略该警告。当然,它也是一个很好的警告 - 如果你在析构函数中访问的任何函数或变量属于类,那么这是不安全的,因为你可能在它们构造之前/它们被破坏之后访问它们。如果你知道你的初始化/销毁订单,问题并不重要,但通常是一个不好的举动,因为这会使维护工作变得非常繁琐。因为您可以捕获构造函数参数,我不得不建议。