gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:47:47 25 4
gpt4 key购买 nike

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

最佳答案

问题是您遇到了无穷无尽的递归。您已经替换了全局 ::operator new everything 默认使用它。这包括由默认分配器执行的分配,例如 std::vector<T>。使用。所以你调用count电话 push_back ,需要重新分配,最终调用 ::operator new ,它调用 count , 这...

如果你想保留这个方案,你将不得不编写不使用 ::operator new 的分配器,然后修改count_v的类型使用该分配器。

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

关于c++ - 在重载的全局新运算符中使用静态对象导致核心转储运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28496587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com