核心思想:****阻止栈资源的释放

当编译器在栈上分配资源时,必须确保其能够在离开作用域时通过调用析构函数被释放。如果人为指定析构函数不可见,那么编译器就会报错,从而阻止了栈上的资源分配。也就是说,需要**破坏编译器在在栈上自动管理生命周期的能力**:

private :

HeapOnly() = default;

此时类对象位于堆上,需要通过指针进行管理,因此在类中定义一个“静态工厂函数”:

static std::unique_ptr create(){ return std::unique_ptr(new HeapOnly()); }


二:只能在栈上创建对象的类#

核心思想:禁止一切形式的 new 操作

当我们在外部使用“new T()”创建类对象时,编译器会在类或全局作用域下寻找 new 的重载,如果将 new 标记为 delete,就能从源头切断堆上的分配:

// 禁止单个对象的堆分配

void* operator new(std::size_t)= delete;

void operator delete(void*)= delete;

// 禁止数组形式的堆分配

void* operator new[](std::size_t) = delete;

void operator delete[](void*) = delete;