如何构造一个类,使得只能在堆上或只能在栈上分配内存?

要构造一个类,使其实例只能在堆上或只能在栈上分配内存,我们可以通过控制类的构造函数、析构函数和操作符 new 的可访问性来实现。

##### 只能在堆上分配内存的类

要使类的实例只能在堆上分配,可以将其析构函数设置为私有。这样,在栈上创建对象将会导致编译错误,因为栈上的对象在离开作用域时会自动调用析构函数,而私有析构函数在类外部是不可访问的。

“`cpp
class HeapOnly {
public:
static HeapOnly* create() {
return new HeapOnly();
}

   void destroy() {
       delete this;
   }

private:
HeapOnly() {} // 私有构造函数
~HeapOnly() {} // 私有析构函数
};

“`

使用方法:

“`cpp
HeapOnly* obj = HeapOnly::create();
// …
obj->destroy();
“`

##### 只能在栈上分配内存的类

要使类的实例只能在栈上分配,可以将其操作符 new 设置为私有。这样,使用 new 尝试在堆上分配对象时,会遇到编译错误。

“`cpp
class StackOnly {
public:
StackOnly() {}
~StackOnly() {}

private:
void* operator new(size_t) = delete; // 禁用new操作符
void operator delete(void*) = delete; // 禁用delete操作符
};

“`

使用方法:

“`cpp
StackOnly obj; // 正确
// StackOnly* obj = new StackOnly(); // 错误:不能在堆上分配
“`

在设计这样的类时,需要注意确保类的使用符合预期的内存分配方式。例如,只能在堆上分配的类,应提供安全的创建和销毁机制,以确保资源的正确管理。而只能在栈上分配的类,则要确保不会被误用于动态内存分配。

发表评论

后才能评论