如何构造只能在堆/栈上创建对象的类
核心思想:****阻止栈资源的释放 当编译器在栈上分配资源时,必须确保其能够在离开作用域时通过调用析构函数被释放。如果人为指定析构函数不可见,那么编译器就会报错,从而阻止了栈上的资源分配。也就是说,需要**破坏编译器在在栈上自动管理生命周期的能力**: 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;