今天打算打算讨论关于内存分配,两个比较有意思的话题,我们如何做到自定义对象禁止在堆上分配空间,又如何做到只在堆上分配空间,其实做法很简单,只是巧妙地利用了C++
语言提供的特性。
我们先来谈第一个话题,如何禁止对象在堆上分配内存
1. 禁止堆上分配内存
其实做法很简单,我们只要重载了自己的成员operator new
和operator delete
函数之后,并将其访问权限设为私有即可,对于这两个函数不熟悉的读者可以参考我的另一篇文章《浅析内存分配》
struct HeapProhibit {
private:
void* operator new(size_t size) { return NULL; }
void operator delete(void*) {}
};
在C++2.0
以后,更加推荐下面的写法
struct HeapProhibit {
void* operator new(size_t size) = delete;
void operator delete(void*) = delete;
};
下面我们看看第二个话题,如何强制在堆上分配内存
2. 强制在堆上分配内存
在某些场合下,我们可能鼓励使用对分配内存,为此,我们只需要将析构函数声明为private
即可
struct HeapOnly {
void release() { delete this; }
private:
~HeapOnly() {}
};
注意,我们上面提供了public
接口release
,用来销毁对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。