微智科技网
您的当前位置:首页stack对象与heap对象

stack对象与heap对象

来源:微智科技网

 禁止产生堆对象

1、产生堆对象使用new operator,可认为new operator有三个过程:

  a、使用operator new操作符搜索可用的内存,分配一块内存;

  b、在这块内存上,调用构造方法构造一个对象;

2、要禁止产生堆对象,可以声明类的operator new为private,禁止分配内存就好了。为了保持一致性,将operator delete也重载为private。

3、注意:new operator不能改变它的行为,operator new是可以重载的。


 禁止产生栈对象

1、对于栈对象,栈顶指针挪出一块内存,调用构造方法直接构造对象,离开作用域,调用析构方法。

2、因此,要禁止产生栈对象。可以将构造方法或者析构方法声明为private。

3、将构造方法声明为private,那么问题来了,这将导致无法在类的外部使用new 创建堆对象,为什么?

4、将构造方法声明为private,必须使用静态方法对外暴露产生的堆对象,同时构造方法有多个,为了禁止产生栈对象,每个都必须声明为private。有没有更好的办法呢?

5、将析构方法声明为private,毕竟析构方法就只有一个。析构方法为private,栈上对象调用构造方法,没有问题,离开作用域,试图调用析构方法,出错了。编译报错。使用new创建对象,没问题。

6、但是有新的问题了,这时候不能使用delete operator释放内存了。为什么?

  考虑string* ps;  delete ps产生如下的代码:

  ps->~string();

  operator delete(ps);

  这就相当于,在外部使用private 析构方法了。编译当然出错。那该怎么办呢?

7、只能在类的内部使用delete,因此需要重新暴露一个接口Destroy(),Destroy调用delete。

8、将析构方法声明为private,还有一个问题。那就是,导致子类析构的时候无法调用父类的析构方法。怎么办?

  将析构方法声明为protected。

因篇幅问题不能全部显示,请点此查看更多更全内容