写出文件时出现奇怪的glibc错误

时间:2012-04-25 23:23:37

标签: c++ glibc

我收到一个奇怪的错误:

*** glibc detected *** findbasis: free(): invalid next size (normal): 0x0000000006a32ce0 ***

当我尝试关闭()std :: ofstream:

void writeEvectors(int l, parameters params, PetscReal* evectors, int basis_size)
{
    for (int n = 1 + l; n <= params.nmax(); n++)
    {
        std::stringstream fname(std::ios::out);
        fname << params.getBasisFunctionFolder() << "/evectors_n" << std::setw(4) << std::setfill('0') << n << "_l" << std::setw(3) << std::setfill('0') << l;
        std::ofstream out(fname.str().c_str(), std::ios::binary);
        std::cerr << "write out file:" << fname.str() << " ...";
        out.write((char*)( evectors + n * basis_size),sizeof(PetscReal) * basis_size);
        std::cerr << "done1" << std::endl;
        if (out.fail() || out.bad())
            std::cerr << "bad or fail..." << std::endl;
        out.close();
        std::cerr << "done2" << std::endl;
    }
    std::cout << "done writing out all evectors?" << std::endl;
}

运行时,此程序永远不会到达“done2”(或“坏或失败......”),但到达“done1”。此外, 写出的数据也很好(就像我期望的那样)。

我真的不知道为什么会发生这种情况,我想不出任何理由“close()”会失败。

感谢您的帮助。

(我开始认为这是某种编译器错误/错误。我正在通过mpicxx运行GCC 4.1.2(!)(相信RHEL 5)

1 个答案:

答案 0 :(得分:2)

glibc错误听起来像释放内存有问题。如果你在一个免费的内存分析器Valgrind内部运行,它应该给你一个更有用的错误解释。

在Valgrind中运行是相当轻松的 - 只需使用-g选项编译可执行文件以添加调试标志(假设您正在使用GNU编译器),然后在Linux终端中输入valgrind ./your_executable并查看会发生什么。