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的库中得到修复,其中继承被更改为私有.
你正在调用default_delete< UniqueElement >::operator () ( UniqueElement* ptr ),因为uniqe_ptr是从它派生的(从空基类优化中受益),并且它会删除ptr.虽然我不认为标准禁止它,但这并不是你想要的行为.