Visual Studio 2010中unique_pointer的奇怪行为

时间:2012-07-02 14:24:14

标签: c++ visual-studio-2010 visual-c++ c++11 unique-ptr

我尝试写这个课

#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方法是什么?

3 个答案:

答案 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)) {
}