控制对象的内存分配

2021年01月14日 阅读数:7
这篇文章主要向大家介绍控制对象的内存分配,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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

1. 禁止堆上分配内存

其实作法很简单,咱们只要重载了本身的成员operator newoperator 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

2. 强制在堆上分配内存

在某些场合下,咱们可能鼓励使用对分配内存,为此,咱们只须要将析构函数声明为private便可对象

struct HeapOnly {
  void release() { delete this; }

private:
  ~HeapOnly() {}
};

注意,咱们上面提供了public接口release,用来销毁对象。接口