一、只能在堆上
方法:将析构函数设置为私有
原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象
class Test
{
public:
void printT(){
cout << "printT" << endl;
}
void freeT(){
delete this;
}
private:
~Test(){
cout << "~Test()" << endl;
}
};
int main( )
{
// 不能在栈上创建对象
//Test t; // prog.cc:25:10: error: variable of type 'Test' has private destructor
// 只能在堆上创建对象
Test *t = new Test;
t->printT();
// 销毁对象
t->freeT();
return 0;
}
输出:
Start
printT
~Test()
0
Finish
二、只能在栈上
方法:将 new
和 delete
重载为私有
原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象