问题描述
||
我从Visual C ++ 2010中获得了“ 0”:
我有一个持有手柄的类,并且即使该类的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,但这需要单独的定义。
我的问题是:警告是否与此特定情况有关?不管哪种方式,具体原因是什么?有没有简单的方法可以避免这种情况?
解决方法
简短的是,如果您传递
this
指针,并且该指针用于访问初始化程序列表或析构函数Bad Things Happen™中的成员函数或变量。如果您知道这种情况不会发生,请随时忽略该警告。当然,这也是一个很好的警告-如果您在析构函数中访问的任何函数或变量都属于该类,那么这是不安全的,因为您可能在构造它们之前/破坏之后访问它们。如果您知道初始化/销毁的顺序,问题并不严重,但通常是一个不好的举动,因为这会使维护工作变得轻而易举。因为您可以捕获构造函数参数,所以我建议这样做。