多次成功运行代码后C++ bad_alloc错误

C++ bad_alloc error after running code successfully multiple times

本文关键字:bad alloc 错误 C++ 成功 运行 代码      更新时间:2023-10-16

我对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];
}