多次成功运行代码后C++ bad_alloc错误
C++ bad_alloc error after running code successfully multiple times
我对C++相对较新,我的项目遇到了问题。 我运行了几次以下代码没有问题,但现在当我尝试运行它时,它会给我一个 std::bad_alloc 错误。代码是C++但有些行是ROOT独有的,ROOT是为粒子物理学家C++编写的程序。
class Particle {
public:
int pdgid;
float px;
Particle(int pdg, float px){
pdgid = pdg;
px = px;
}
};
TFile* file = new TFile("filename.root"); //ROOT code, where particle values are obtained from.
TTree* tree = (TTree*)file->Get("FlatTree"); //tree is where all events and associated values are held
vector<Particle> allparticles;
for (unsigned iEntry = 0; iEntry<tree->GetEntries(); iEntry++) {
tree->GetEntry(iEntry);
for (int iVecEntry = 0; iVecEntry < nfsp; iVecEntry++) {
allparticles.push_back(Particle(pdg[iVecEntry],px[iVecEntry]));
}
}
如果我减少第一个 for 循环的限制,代码就会起作用。条目数量非常大(超过 200 万),nfsp 最多可以达到 24 个,具体取决于事件。这导致矢量所有粒子具有超过 700 万个粒子对象。
我认为问题在于没有足够的内存来分配如此大的矢量,但这以前是如何工作的?是否有可能在我运行代码的前几次没有正确释放内存?
我对内存管理有点困惑。操作系统C++处理释放?还是必须包含析构函数?
我尝试过包括析构函数,但无法让它工作。 来自"std::bad_alloc":我是否使用了太多内存?我尝试在代码末尾包含一个 delete[] 语句,但这也不起作用。
任何意见和帮助都非常感谢!
附言我正在运行 linux mint 18.2 Sonya。
是的,听起来您的堆栈内存已用完。这是解释堆与堆栈内存的众多教程之一。
您是在堆栈内存中创建粒子,因此这意味着当它们超出范围时,它们将自动销毁。堆栈内存大小因编译器和环境而异,但获得的堆栈内存比堆内存少得多。
为了解决这个问题,我将创建一个指向粒子的指针向量,并动态创建粒子。例:
vector<Particle*> allparticles;
...
allparticles.push_back(new Particle(pdg[iVecEntry],px[iVecEntry]));
请记住,在完成动态分配的堆内存后将其删除。例:
for(int i < 0; i < allparticles.size(); i++){
delete allparticles[i];
}
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- CGAL:Hausdorff距离不良Alloc
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- C STD ::初始化类对象中的Alloc错误错误
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"