在回溯中使用`delete`取消分配时出现`free()`错误

won*_*nko 1 c++ debugging ipopt

我从gdb得到以下错误:

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

这是回溯:

#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`
Run Code Online (Sandbox Code Playgroud)

这是代码 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_;
  }
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么free()~TNLPAdapter()使用时会抛出错误delete[]?此外,我想介入,~TNLPAdapter()以便我可以看到哪个解除分配导致错误.我相信错误发生在外部库(IPOPT)中,但我已经使用调试标志编译它; 这够了吗?

AnT*_*AnT 5

原始内存分配/解除分配后面机构new[]/ delete[]通常是相同的,通过使用所述一个malloc/ free.标准库实现原始内存分配/释放功能operator new[]/ operator delete[]实际上可以直接调用mallocfree.因此,free即使您正在使用,也会报告错误,这并不奇怪delete [].

您获得的错误表明违反了堆的完整性.堆坏了.问题的根源可以是这个函数(双重自由?)还是在一些完全不同的地方(双重释放或内存溢出?).没有办法说出你发布的代码发生了什么.

找出delete []报告问题的具体调用,并查看是否有其他代码覆盖了该内存块.或者只是使用像valgrind这样的外部工具来抓住罪犯.