如果想要类分配在堆上而不是栈上,也就是说只能通过new的方式创建对象,可以将类的析构函数设置位protected或者 private保护。
class Test
{
public:
Test() {}
void Destroy(){
delete this;
}
protected:
~Test() {}
};
int main()
{
// 正确的使用方式
Test* obj = new Test();
obj->Destroy();
// 下面的方式无法通过编译
Test obj;
system("pause");
return 0;
}
若要类对象只能分配在栈上,就重载new运算符,并且实现为protected/private:
class Test
{
public:
Test(){}
~Test){}
protected:
static void* operator new(size_t size);
static void operator delete(void* ptr, std::size_t size);
};
int main()
{
// 错误的使用方式,无法通过编译
Test* obj = new Test();
// 正确的使用方式
Test Obj;
system("pause");
return 0;
}