私有析构函数,但我可以手动删除VS2015中的对象

时间:2015-10-27 13:57:15

标签: c++ visual-studio-2015

VS2015编译器有问题吗?我总是假设如果我声明一个类的析构函数是私有/受保护的我不能手动销毁该对象,但在VS2015中我可以轻松编译该代码:

class X
{
public:
    template<class T>
    T* create(T v = T{})
    {
        return new T{ v };
    }
    X(){}
private:
    ~X() {}

};

int main()
{
    X* x{new X};
    auto i{ x->create<int>() };
    auto d{ x->create<double>(2) };
    delete i;
    delete d;
    return 0;
}

3 个答案:

答案 0 :(得分:2)

您使用x->create方法创建intdouble,然后将其删除。

intdouble没有析构函数;没有理由你不能删除它们。

x有一个私有析构函数,但您不会在代码中的任何位置删除x。

答案 1 :(得分:1)

您的X类是模板化的工厂类。它创建了T类型的对象,在您的情况下为int *和double *。

然后初始化一个int *和double *指针指向工厂返回的值,这意味着调用删除的2个新对象。

你永远不会在x本身上调用delete,你在x :: create返回的对象上调用delete(意思是i和d)。

答案 2 :(得分:1)

在你的程序中,你不要调用类X的析构函数。如果你写了表达式

delete x;

程序无法编译。

考虑一个更简化的例子

class X
{
    ~X() {}
};    


int main()
{
    X x;

    return 0;
}

编译器不会编译程序,因为类的析构函数是私有的,它应该在main的末尾调用。