一、只能在堆上

方法:将析构函数设置为私有
原因: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

二、只能在栈上

方法:将 newdelete 重载为私有
原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象