13

我试着写这门课

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

4

3 回答 3

21

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

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

于 2012-07-02T14:32:50.740 回答
9

您正在调用default_delete< UniqueElement >::operator () ( UniqueElement* ptr ),因为 uniqe_ptr 派生自它(以受益于空基类优化),并且它删除了ptr. 尽管我认为标准并没有禁止它,但这并不是您想要的行为。

于 2012-07-02T14:34:26.293 回答
2

它应该像

ContainerUnique::ContainerUnique(void):u(new UniqueElement(1)) {
}
于 2012-07-02T14:31:38.893 回答