Visual Studio 2010 中unique_pointer的奇怪行为

Strange behaviour for unique_pointer in Visual Studio 2010

本文关键字:pointer Studio 2010 unique Visual      更新时间:2023-10-16

我试着写这个类

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

这是

VS2010 unique_ptr的已知问题。如果作为优化为空(空基优化),则它公开继承其删除器。公共继承的缺点是删除器的所有成员也都成为unique_ptr的可用成员,在这种情况下,删除指针的operator()(T*)

该错误在VS2012的库中得到修复,其中继承更改为私有。

您正在调用default_delete< UniqueElement >::operator () ( UniqueElement* ptr ),因为uniqe_ptr派生自它(从空基类优化中受益),并且它会删除ptr。这对你来说并不完全是预期的行为,尽管我不认为标准禁止它。

它应该像这样完成

ContainerUnique::ContainerUnique(void):u(new UniqueElement(1)) {
}