我尝试写这个课
#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?
}
它没有例外地符合。运行程序我发现在调用ContainerUnique
的构造函数后,u
包含一个空指针。
这是预期的行为吗?我实际上称之为unique_ptr方法是什么?
答案 0 :(得分:20)
This is a known problem with VS2010's unique_ptr
. 公开从其删除中继承,如果它是空的优化(空基础优化)。公共继承的缺点是删除器的所有成员也成为unique_ptr
的可用成员,在这种情况下是删除指针的operator()(T*)
。
该错误在VS2012的库中得到修复,其中继承被更改为私有。
答案 1 :(得分:8)
您正在调用default_delete< UniqueElement >::operator () ( UniqueElement* ptr )
,因为uniqe_ptr派生自它(从空基类优化中受益),并删除ptr
。这并不是你想要的行为,虽然我不认为标准禁止它。
答案 2 :(得分:2)
应该像
那样完成ContainerUnique::ContainerUnique(void):u(new UniqueElement(1)) {
}