c++的内存管理真的是博大精深呀~
生成对象
我们一般生成对象有两种方式,直接生成和通过new(先不考虑使用new在栈生成的情况)生成,分别对应静态和动态的生成。
1 | MyClass mc1; //栈 |
两个都需要用到构造函数(这不废话嘛~),所以我们不能通过私有构造函数的方式来达到我们的目的。
只在堆上生成的对象
换句话说就是禁用掉直接生成的方式,我们回忆一下栈的特点,栈上的内存会自动分配和 自动销毁,那对象的销毁会调用什么呢?析构函数!
假如析构函数失效了,那栈不就不能达到它的目的了吗。
实际上,栈有这样的特点:编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。
所以我们把析构函数定义为私有不就实现了不能在栈上生成了。
等等,析构函数没了,那你堆不也不能销毁了。嘿嘿,堆上怎么销毁主要还是靠我们说嘛,那定义多一个销毁函数,让他和析构做一样的事不就行了。所以对于堆,不要这个对象时,调用一下自己定义的销毁函数就行了。
只在栈上生成的对象
在堆生成需要用到new关键字,如果new关键字失效了不就达到目的了。而且new相比malloc一个主要的特点就是能重载new和delete,所以说我们可以把new设为私有的函数,这样就能避免在堆上生成了。