c++ - 在派生类中重写运算符 new/delete

标签 c++ memory-management singleton overriding new-operator

我有一个无状态的抽象基类,各种具体类都从中继承。其中一些派生类也是无状态的。因为它们中的许多是在运行期间创建的,所以我想通过覆盖运算符 new()/delete() 让所有无状态派生类模拟单例来节省内存和开销。一个简化的例子看起来像这样:

#include <memory>

struct Base {
  virtual ~Base() {}
 protected:
  Base() {}   // prevent concrete Base objects
};

struct D1 : public Base {  // stateful object--default behavior
  int dummy;
};

struct D2 : public Base {  // stateless object--don't allocate memory
  void* operator new(size_t size)
  {
    static D2 d2;
    return &d2;
  }
  void operator delete(void *p) {}
};

int main() {
  Base* p1 = new D1();
  Base* p2 = new D1();
  Base* s1 = new D2();
  Base* s2 = new D2();
  delete p1;
  delete p2;
  delete s1;
  delete s2;
  return 0;
}

此示例不起作用:delete s2;失败,因为 delete s1;称为 ~Base() ,它释放了共享的 Based2 .这可以通过向 Base 添加新/删除重载的相同技巧来解决。但我不确定这是最干净的解决方案,甚至是正确的解决方案(valgrind 不会提示,FWIW)。我会很感激建议或批评。

编辑:实际上,情况更糟。这个例子中的 Base 类并不像我声称的那样是抽象的。如果通过添加纯虚方法将其抽象化,那么我就不能再应用新建/删除覆盖技巧,因为我不能拥有 Base 类型的静态变量。所以我对这个问题没有任何解决方案!

最佳答案

你不能那样做 - 这会违反“对象身份”要求,即 each object must have its own address .您必须为每个对象分配不同的内存块 - 如果您覆盖 operator new 以使用专为固定大小的对象量身定制的快速 block 分配器,这可以相当快地完成。

关于c++ - 在派生类中重写运算符 new/delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6435052/

相关文章:

c++ - 确定 map 是否包含键的值?

c++ - 如何获得 QTreeWidget 内部项目移动的通知?

c++ - 从对象C++中的文件读取内容时发生段错误

c++ - 如何清除为 C++ 中的指针正确指向的数组分配的内存?

iphone - iOS NSDictionary 复制内存泄漏

c++ - 为什么 realloc 会使我的自定义分配器数据无效?

ios - 我如何将这个 Swift 3 Singleton 用作我的 IOS 项目的全局计时器?

c++ - Visual Studio 2015 C++ 应用程序需要客户端客户端上的 api-ms-win-crt-runtime-l1-1-0.dll

c++ - 单例,奇怪的重复模板模式和转发构造函数参数

java - 如何使用可运行程序在单例中执行工作?