在重载的全局新运算符中使用静态对象导致核心转储 运行 时间错误

Using static object in overloaded global new operator cause core dumped run time error

在这段代码中,我厌倦了简单地知道我忘记删除了哪个对象,所以我用一个静态对象创建了一个单例来计算新分配的对象,但是在全局 new 函数中使用这个对象会导致错误,如果我想使用像 cout 这样的标准对象,也会出现同样的错误。该错误的原因可能是什么?获得相同效果的正确方法是什么?

#include <vector>
#include <cstdlib>
#include <new>
#include <iostream>

class Count_new { //singleton 

  std::vector<void*>count_v ; // to get "new" pointers
  Count_new(){}
  Count_new(const Count_new&);

public:
  void  count(void * m) {
    count_v.push_back(m);
  }

  static Count_new * instance(){
    static Count_new c ;
    return &c;
  }

  ~Count_new() 
  {
    unsigned int index = 0 ;
    while (index < count_v.size()) {
      if(count_v.at(index) != NULL) 
      std::cout << count_v.at(index) << " not deleted\n" ;
    }
  }
};

Count_new &c = *Count_new::instance();

void * operator new (size_t sz) throw (std::bad_alloc){
  void *m = malloc(sz);
  c.count(m); //produce Error core dumped
  return m;

}

class Obj{};

int main() {
  try {
    Obj *p1 = new Obj ;
    Obj *p2 = new Obj ;
  }catch(std::bad_alloc&b){
    std::cout << "Error in memory allocation:" << b.what()<< "\n";
  }
}

问题是您遇到了无穷无尽的递归。您已经替换了默认情况下由 everything 使用的全局 ::operator new。这包括由默认分配器执行的分配,例如 std::vector<T> 使用的分配器。因此,您对 count 的调用会调用 push_back,后者需要重新分配,最终会调用 ::operator new,后者又会调用 count,而...

如果要保留此方案,则必须编写不使用 ::operator new 的分配器,然后修改 count_v 的类型以使用该分配器。

哦,我会放弃动态异常规范,它们自 C++11 以来已被弃用。