今天打算打算讨论关于内存分配,两个比较有意思的话题,咱们如何作到自定义对象禁止在堆上分配空间,又如何作到只在堆上分配空间,其实作法很简单,只是巧妙地利用了C++
语言提供的特性。
咱们先来谈第一个话题,如何禁止对象在堆上分配内存segmentfault
其实作法很简单,咱们只要重载了本身的成员operator new
和operator delete
函数以后,并将其访问权限设为私有便可,对于这两个函数不熟悉的读者能够参考个人另外一篇文章《浅析内存分配》函数
struct HeapProhibit { private: void* operator new(size_t size) { return NULL; } void operator delete(void*) {} };
在C++2.0
之后,更加推荐下面的写法this
struct HeapProhibit { void* operator new(size_t size) = delete; void operator delete(void*) = delete; };
下面咱们看看第二个话题,如何强制在堆上分配内存code
在某些场合下,咱们可能鼓励使用对分配内存,为此,咱们只须要将析构函数声明为private
便可对象
struct HeapOnly { void release() { delete this; } private: ~HeapOnly() {} };
注意,咱们上面提供了public
接口release
,用来销毁对象。接口