1

奇妙なエラーが発生します:

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

std :: ofstreamをclose()しようとすると:

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」(または「bad or fail ...」)に到達することはありませんが、「done1」に到達します。また、書き出されたデータは良いです(私が期待しているように)

正直なところ、なぜこれが起こるのか途方に暮れています。「close()」が失敗する理由は考えられません。

助けてくれてありがとう。

(これはある種のコンパイラのバグ/エラーだと思い始めています。mpicxxを介してGCC 4.1.2(!)(RHEL 5だと思います)を実行しています)

4

1 に答える 1

2

glibcエラーは、メモリの解放に問題があるように聞こえます。空きメモリプロファイラーであるValgrind内で実行する場合は、エラーについてより役立つ説明が得られるはずです。

Valgrindでの実行はかなり簡単です。-gオプションを指定して実行可能ファイルをコンパイルしてデバッグフラグを追加し(GNUコンパイラを使用していると仮定)、Linuxターミナルで入力valgrind ./your_executableして何が起こるかを確認します。

于 2012-04-25T23:28:44.593 に答える