static StackOnly Create()
return StackOnly();
private:
void* operator new(size_t size) = delete;
void operator delete(void* p) = delete;
private:
int _a;
这段代码定义了一个名为 StackOnly
的类,它只能在栈上创建。这是通过将 new
和 delete
操作符设置为 = delete
来实现的,这样就禁止了在堆上分配和释放对象的操作。
当你将函数声明为 = delete
时,它表示该函数被删除,不能使用。在这种情况下,它用于防止用户使用 new
和 delete
来在堆上创建和销毁对象。
new
和 delete
操作符用于在堆上分配和释放内存。当你使用 new
来创建一个对象时,它会在堆上调用operator new()
分配内存并调用构造函数来初始化对象。当你使用 delete
来销毁一个对象时,它会调用析构函数来清理对象并调用operator delete()
释放堆上的内存。
在这段代码希望 StackOnly
类的对象只能在栈上创建。为了实现这一点,禁止了在堆上分配和释放对象的操作,即通过将 new
和 delete
操作符设置为 = delete
来实现。这样,如果用户尝试使用 new
来创建一个 StackOnly
对象,编译器会报错,因为该操作符已被删除。
C++98的写法:
new
和delete
默认调用的是全局的operator new()
和operator delete()
,但如果一个类重载了专属的operator new()
和operator delete()
,那么new
和delete
就会调用这个专属的函数。所以只要把operator new()
和operator delete()
屏蔽掉,那么就无法再使用new
在堆上创建对象了。
然而,这段代码仍然允许用户在静态区创建对象,即: