今天打算打算讨论关于内存分配,两个比较有意思的话题,我们如何做到自定义对象禁止在堆上分配空间,又如何做到只在堆上分配空间,其实做法很简单,只是巧妙地利用了C++语言提供的特性。
我们先来谈第一个话题,如何禁止对象在堆上分配内存

1. 禁止堆上分配内存

其实做法很简单,我们只要重载了自己的成员operator newoperator 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,用来销毁对象。


已注销
26 声望1 粉丝