面试题:C++如何只在堆上或栈上生成对象

本文介绍了如何通过修改构造函数和析构函数的访问级别来控制对象在栈或堆上的生成与销毁。通过将operator new和delete设为私有,确保对象只能在栈上创建;而将析构函数设为受保护,并提供静态创建方法,则让对象仅能在堆上生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈一般是静态建立一个对象时,由编译器自动创建,而堆通常是调用new来动态开辟内存。

由此可知,如果不能调用new,那么也就无法在堆上生成对象了。我们将operator new和operator delete置为私有部分,类外就无法调用new在堆上生成对象了,也就只能在栈上生成对象。代码如下:

class B
{
public:
    B()
    {
        cout << "B()" << endl;
    }

    ~B()
    {
        cout << "~C" << endl;
    }

private:
    void* operator new(size_t);
    void operator delete(void*);
};

void Test()
{
    //B* ptr = new B();
    B b;
}

那么如何只在堆上生成对象呢?
我们可以将析构函数置为protected,这样,类外使用静态方法创建对象的时候就会报错,同时要在类外自己提供释放对象的接口。代码如下:

class C
{
public:
    static C* Creat()
    {
        return new C();//通过静态成员函数完成对象的构造
    }

    void Destroy()
    {
        delete this;
    }
protected://将默认构造函数与析构函数设为保护
    C()
    {
        cout << "C()" << endl;
    }
    ~C()
    {
        cout << "~C()" << endl;
    }
};

void Test()
{
    //C c;//不可访问
    C *pc = C::Creat();
    pc->Destroy();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值