如何限制栈对象的生成?如何限制堆对象的生成?
1)限制堆对象的生成:
将operator new和operator 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