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;
}
答案 0 :(得分:2)
您使用x->create
方法创建int
和double
,然后将其删除。
int
和double
没有析构函数;没有理由你不能删除它们。
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的末尾调用。