我试图写这个类

#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)。

09-30 21:45