如何限制栈对象的生成?如何限制堆对象的生成?

本文深入探讨了如何通过将操作符声明为私有或保护属性来限制堆对象与栈对象的生成。具体包括如何在类中声明operatornew和operatordelete为私有以阻止堆内存分配,以及如何将析构函数设置为保护或私有以防止栈对象的自动析构过程。通过实例代码解析了实现机制,并强调了在继承关系中保护析构函数的重要性。

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

如何限制栈对象的生成?如何限制堆对象的生成?


1)限制堆对象的生成:

将operator newoperator delete操作符声明为private.

class A
{
public:
	A(){cout<<"Create A"<<endl;}
	~A(){cout<<"Destroy A"<<endl;}
private:  /* 声明为private即可,不需要定义它 */
	void* operator new(size_t size);
	void operator delete(void* p);
};

原因:

因为执行A *pa = new A时实际上执行的操作为:

A *pa;

Pa = operator new(sizeof( A )); /* 如果operatornew 声明为私有的,则编译器这里报错 */

If (NULL != pa)

{

   Pa->A::A(); /* 调用构造函数 */

}


2)限制栈对象的生成:

将对象的析构函数声明为私有或保护的。

class B
{
public:
	B(){cout<<"Create B"<<endl;}
	void destroy()
	{
		delete this;
	}

protected: /* 声明为protected则不影响继承 */
	virtual ~B(){cout<<"Destroy B"<<endl;}

};

class D: public B
{
public:
	D(){cout<<"Create D"<<endl;}
	~D(){cout<<"Destroy D"<<endl;}

};
测试:

B *pb = new D;
    pb->destroy();

原因:

我们在声明栈对象时,编译器实际上会将代码扩展成如下样子:(同时解释了创建栈对象会自动调用构造函数,出作用域时自动调用析构函数)

{

A a;  //栈对象

// a.A::A();//编译器自动插入的构造函数

……

//a.A::~A();//编译器自动插入的析构函数           <如果将析构函数声明为protected 或 private ,则编译器会在这里出错>

}


最好将析构函数声明为protected,否则可能影响继承。见上述代码。


参考:http://blog.sciencenet.cn/blog-267716-666789.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值