C++ 私有析构函数,但我可以手动删除VS2015中的对象
VS2015编译器有什么问题吗?我一直认为,如果我声明a类私有/受保护的析构函数,我将无法手动销毁该对象,但在VS2015中,我可以轻松编译该代码:C++ 私有析构函数,但我可以手动删除VS2015中的对象,c++,visual-studio-2015,C++,Visual Studio 2015,VS2015编译器有什么问题吗?我一直认为,如果我声明a类私有/受保护的析构函数,我将无法手动销毁该对象,但在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};
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;
}
X类
{
公众:
模板
T*create(tv=T{})
{
返回新的T{v};
}
X(){}
私人:
~X(){}
};
int main()
{
X*X{new X};
自动i{x->create()};
自动d{x->创建(2)};
删除i;
删除d;
返回0;
}
您的X类是一个模板化的工厂类。它创建T类型的对象,在您的例子中是int*和double*
然后初始化一个int*和double*指针,指向工厂返回的值,这意味着调用delete的2个新对象
您从不对x本身调用delete,而是对x::create(意思是i和d)返回的对象调用delete。您使用
x->create
方法创建int
和double
,然后删除它们
int
和double
没有析构函数;没有理由不能删除它们
x
有一个私有析构函数,但您不能在代码中的任何地方删除x。在您的程序中,您不能调用类x的析构函数。如果您编写表达式
delete x;
程序将无法编译
考虑一个更简单的例子
class X
{
~X() {}
};
int main()
{
X x;
return 0;
}
编译器不会编译该程序,因为该类的析构函数是私有的,应该在main的末尾调用它。但您不会在代码中的任何地方手动销毁该对象。。。你的意思是让
删除x代码>在某处?添加删除x
查看问题。@RSahu当然是我的!谢谢你,伙计!