c++ - 如何防止通过 'new' 运算符分配类? (我想确保我的 RAII 类始终分配在堆栈上。)

标签 c++ operator-overloading c++-faq

我想确保我的 RAII 类始终分配在堆栈上。

如何防止通过“new”运算符分配类?

最佳答案

您需要做的就是将类的新运算符声明为私有(private):

class X
{
    private: 
      // Prevent heap allocation
      void * operator new   (size_t);
      void * operator new[] (size_t);
      void   operator delete   (void *);
      void   operator delete[] (void*);

    // ...
    // The rest of the implementation for X
    // ...
};  

将“operator new”设为私有(private)可以有效地防止类外的代码使用“new”来创建 X 的实例。

要完成事情,您应该隐藏“运算符删除”和两个运算符的数组版本。

从 C++11 开始,您还可以显式删除函数:

class X
{
// public, protected, private ... does not matter
    static void *operator new     (size_t) = delete;
    static void *operator new[]   (size_t) = delete;
    static void  operator delete  (void*)  = delete;
    static void  operator delete[](void*)  = delete;
};

相关问题: Is it possible to prevent stack allocation of an object and only allow it to be instiated with ‘new’?

关于c++ - 如何防止通过 'new' 运算符分配类? (我想确保我的 RAII 类始终分配在堆栈上。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/124856/

相关文章:

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 局部函数声明有什么用吗?

haskell - 使用具有约束字段的数据类型代替约束

c++ - 删除 boost::thread 后代

c++ - 结构取消引用运算符(运算符->)

c# - 如何编写两个参数都是接口(interface)的重载运算符

c++ - 我在哪里可以找到标准容器和算法的所有异常保证?

c++ - 选择在 Windows 7 上无法正常工作

c++ - 如何使用 minizip 读取子文件夹中的文件