在重载的全局新运算符中使用静态对象导致核心转储 运行 时间错误
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 以来已被弃用。
在这段代码中,我厌倦了简单地知道我忘记删除了哪个对象,所以我用一个静态对象创建了一个单例来计算新分配的对象,但是在全局 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 以来已被弃用。