使用特定于类的set_new_handler

Lea*_*ner 9 c++ multithreading operator-overloading new-operator

对于特定于类的new_handler实现,我在"有效的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;
}
Run Code Online (Sandbox Code Playgroud)

D.S*_*ley 4

你说得对。这可能不是线程安全的。您可能需要考虑另一种方法,例如使用以下nothrow版本new

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

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