我试图写这个类
#include <memory>
class ContainerUnique
{
public:
ContainerUnique(void);
~ContainerUnique(void);
private:
std::unique_ptr<UniqueElement> u;
};
其中UniqueElement是在其他位置定义的POD类。我现在像这样定义构造函数主体:
ContainerUnique::ContainerUnique(void)
{
auto tmp = new UniqueElement(1);
this->u(tmp); // u is a unique_ptr<UniqueElement>. Should this call compile?
}
而且它遵守无异常(exception)。运行程序,我发现在调用
ContainerUnique
的构造函数之后,u
包含空指针。这是预期的行为吗?我实际上在调用什么unique_ptr方法?
最佳答案
This is a known problem with VS2010's unique_ptr
.如果优化为空(空基础优化),则它从其删除器公开继承。公共(public)继承的不利之处在于,删除程序的所有成员也将成为unique_ptr
的可用成员,在这种情况下,它是删除指针的operator()(T*)
。
该错误已在VS2012的库中修复,该库将继承更改为私有(private)。