1

gdbから次のエラーが発生しました:

*** glibc detected *** /.root0/autohome/u132/hsreekum/ipopt/ipopt/debug/Ipopt/examples/ex3/ex3: free(): invalid next size (fast): 0x0000000120052b60 ***

バックトレースは次のとおりです。

#0  0x000000555626b264 in raise () from /lib/libc.so.6
#1  0x000000555626cc6c in abort () from /lib/libc.so.6
#2  0x00000055562a7b9c in __libc_message () from /lib/libc.so.6
#3  0x00000055562aeabc in malloc_printerr () from /lib/libc.so.6
#4  0x00000055562b036c in free () from /lib/libc.so.6
#5  0x000000555561ddd0 in Ipopt::TNLPAdapter::~TNLPAdapter ()
   from /home/ba01/u132/hsreekum/ipopt/ipopt/build/lib/libipopt.so.1
#6  0x00000055556a9910 in Ipopt::GradientScaling::~GradientScaling ()
   from /home/ba01/u132/hsreekum/ipopt/ipopt/build/lib/libipopt.so.1
#7  0x00000055557241b8 in Ipopt::OrigIpoptNLP::~OrigIpoptNLP ()
   from /home/ba01/u132/hsreekum/ipopt/ipopt/build/lib/libipopt.so.1
#8  0x00000055556ae7f0 in Ipopt::IpoptAlgorithm::~IpoptAlgorithm ()
   from /home/ba01/u132/hsreekum/ipopt/ipopt/build/lib/libipopt.so.1
#9  0x0000005555602278 in Ipopt::IpoptApplication::~IpoptApplication ()
   from /home/ba01/u132/hsreekum/ipopt/ipopt/build/lib/libipopt.so.1
#10 0x0000005555614428 in FreeIpoptProblem ()
   from /home/ba01/u132/hsreekum/ipopt/ipopt/build/lib/libipopt.so.1
#11 0x0000000120001610 in main () at ex3.c:169`

そしてここにのコードがありますIpopt::TNLPAdapter::~TNLPAdapter ()

  TNLPAdapter::~TNLPAdapter()
  {
    delete [] full_x_;
    delete [] full_lambda_;
    delete [] full_g_;
    delete [] jac_g_;
    delete [] c_rhs_;
    delete [] jac_idx_map_;
    delete [] h_idx_map_;
    delete [] x_fixed_map_;
    delete [] findiff_jac_ia_;
    delete [] findiff_jac_ja_;
    delete [] findiff_jac_postriplet_;
    delete [] findiff_x_l_;
    delete [] findiff_x_u_;
  }

私の質問は:使用free()時にエラーをスローするのはなぜですか?また、どの割り当て解除がエラーの原因であるかを確認できるように、ステップスルーしたいと思います。エラーは外部ライブラリ(IPOPT)で発生すると思いますが、デバッグフラグを付けてコンパイルしました。これで十分ですか?~TNLPAdapter()delete[]~TNLPAdapter()

4

1 に答える 1

5

new[]/の背後にある生のメモリ割り当て/割り当て解除メカニズムは、通常、 /delete[]によって使用されるメカニズムと同じです。生のメモリ割り当て/割り当て解除関数の標準ライブラリ実装/実際に直接呼び出すことができます。このため、を使用している場合でもエラーが報告されることはまったく驚くべきことではありません。mallocfreeoperator new[]operator delete[]mallocfreefreedelete []

発生しているエラーは、ヒープの整合性が侵害されていることを示しています。ヒープが壊れています。問題の原因は、この関数(ダブルフリー?)またはまったく別の場所(ダブルフリーまたはメモリオーバーラン?)にある可能性があります。あなたが投稿したコードから何が起こっているのかを言う方法はありません。

問題を報告する特定の呼び出しを特定しdelete []、他のコードがそのメモリブロックをオーバーライドするかどうかを確認します。または、valgrindなどの外部ツールを使用して犯罪者を捕まえます。

于 2012-08-29T21:30:25.470 に答える