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

时间:2015-02-13 09:43:58

标签: c++ new-operator

在这段代码中,我厌倦了简单地知道哪个对象忘了删除所以我用一个静态对象创建了一个单例来计算新分配的对象,但是在全局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";
  }
}

1 个答案:

答案 0 :(得分:1)

问题是你正在进行无休止的递归。您已经替换了默认情况下所有内容使用的全局::operator new。这包括默认分配器执行的分配,例如std::vector<T>使用的分配。因此,您拨打count的来电需要重新分配push_back,最终会调用::operator new,调用count,其中...... {/ p>

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

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