c++ - 使用类特定的 set_new_handler

标签 c++ multithreading operator-overloading new-operator

对于类特定的 new_handler 实现,我在“effective c++”一书中遇到了以下示例。这在多线程环境中看起来有问题,我的问题是如何在多线程环境中实现类特定的 new_handler?

void * X::operator new(size_t size)
{
    new_handler globalHandler =                // install X's
    std::set_new_handler(currentHandler);    // handler
    void *memory;
    try {                                      // attempt
        memory = ::operator new(size);           // allocation
    }
    catch (std::bad_alloc&) {                  // restore
        std::set_new_handler(globalHandler);     // handler;
        throw;                                   // propagate
    }                                          // exception
    std::set_new_handler(globalHandler);       // restore
                                               // handler
    return memory;
}

最佳答案

你是对的。这可能不是线程安全的。您可能需要考虑一种替代方法,例如使用 nothrow version of new相反:

void* X::operator new(std::size_t sz) {
  void *p;
  while ((p = ::operator new(sz, std::nothrow) == NULL) {
    X::new_handler();
  }
  return p;
}

这将导致您的特定于类的处理程序在内存分配失败时被调用。在您真正了解重载 operator new 的所有令人头疼的问题之前,我不会这样做。特别是,阅读 Herb Sutter 的两部分文章 To New, Perchance To Throw,Part 1Part 2 。有趣的是,他说要避免 nothrow 版本……嗯。

关于c++ - 使用类特定的 set_new_handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1332015/

相关文章:

c++ - 取消引用 void 指针时的 reinterpret_cast 行为

c++ - 在 Qt 中缩放图形

C# Windows 应用程序 - 许多线程使用相同的连接?

c++ - 找不到 C++ 中的重载 << 运算符

C# - 接口(interface)不能包含运算符

c++ - 为什么我的 Linux 编译的二进制文件在 Windows 上运行时不起作用?

c++ - 为什么我们不能在 const 对象上调用函数?

python - 为什么在 python 中有一个不等于运算符

multithreading - 我是否必须为线程需要创建对象的副本

multithreading - 亲子过程