Visual Studio 2010中unique_pointer的奇怪行为

Cof*_*ars 12 c++ visual-studio-2010 unique-ptr visual-c++ c++11

我试着写这堂课

#include <memory>

class ContainerUnique
{
public:

    ContainerUnique(void);
    ~ContainerUnique(void);

private:
    std::unique_ptr<UniqueElement> u;
};
Run Code Online (Sandbox Code Playgroud)

其中UniqueElement是在别处定义的POD类.我现在定义构造函数体如下:

ContainerUnique::ContainerUnique(void)
{
    auto tmp = new UniqueElement(1);

    this->u(tmp); // u is a unique_ptr<UniqueElement>. Should this call compile?
}
Run Code Online (Sandbox Code Playgroud)

并且它没有例外地符合.运行程序我发现在ContainerUnique调用构造函数之后,u包含一个空指针.

这是预期的行为吗?我实际上调用了什么unique_ptr方法?

Xeo*_*Xeo 20

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

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


sti*_*ijn 8

你正在调用default_delete< UniqueElement >::operator () ( UniqueElement* ptr ),因为uniqe_ptr是从它派生的(从空基类优化中受益),并且它会删除ptr.虽然我不认为标准禁止它,但这并不是你想要的行为.