【问题标题】:C++ bad_alloc error after running code successfully multiple times多次成功运行代码后的C++ bad_alloc错误
【发布时间】:2018-01-23 17:32:45
【问题描述】:

我对 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 个。这导致矢量 allparticles 具有超过 700 万个 Particle 对象。

我认为问题在于没有足够的内存来分配如此大的向量,但以前是如何工作的?有没有可能是我前几次运行代码时没有正确释放内存?

我对内存管理有点困惑。在 C++ 中,操作系统是否处理释放?还是我必须包含一个析构函数?

我尝试包含一个析构函数,但无法让它工作。 从"std::bad_alloc": am I using too much memory? 我尝试在代码末尾包含一个 delete[] 语句,但这也不起作用。

非常感谢任何输入和帮助!

附:我正在运行 linux mint 18.2 Sonya。

【问题讨论】:

    标签: c++ memory-management bad-alloc


    【解决方案1】:

    是的,听起来您的堆栈内存已用完。这是解释堆内存与堆栈内存的众多tutorials 之一。

    您正在堆栈内存中创建粒子,因此这意味着它们将在超出范围时自动销毁。堆栈内存大小因编译器和环境而异,但堆栈内存比堆内存少。

    为了解决这个问题,我将创建一个指向粒子的指针向量,并动态创建粒子。示例:

    vector<Particle*> allparticles;
    ...
    allparticles.push_back(new Particle(pdg[iVecEntry],px[iVecEntry]));
    

    记住,当你用完动态分配的堆内存时,要删除它。示例:

    for(int i < 0; i < allparticles.size(); i++){
        delete allparticles[i];
    }
    

    【讨论】:

    • 这是不正确的。向量在堆栈上,但向量的内容不在。 std::vector 管理堆内存以保存其内容。您不需要额外的间接和手动内存管理。
    猜你喜欢
    • 2022-08-06
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多