我从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()
使用~TNLPAdapter()
时,delete[]
为什么会抛出错误?此外,我想逐步浏览~TNLPAdapter()
,以便我可以看到哪个解除分配导致错误。我相信错误发生在外部库(IPOPT)中,但我已经使用调试标志编译它;这够了吗?
答案 0 :(得分:5)
new[]
/ delete[]
背后的原始内存分配/解除分配机制通常与malloc
/ free
使用的机制相同。原始内存分配/释放函数operator new[]
/ operator delete[]
的标准库实现实际上可以直接调用malloc
和free
。因此,即使您使用free
,delete []
也会报告错误也就不足为奇了。
您收到的错误表明违反了堆的完整性。堆坏了。问题的根源可以是这个函数(双重自由?)还是在一些完全不同的地方(双重释放或内存溢出?)。没有办法说出你发布的代码发生了什么。
找出对delete []
的具体调用报告问题,并查看是否有其他代码覆盖了该内存块。或者只是使用像valgrind这样的外部工具来抓住罪犯。