注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

守望

路越远,心越近。有多远,走多远!

 
 
 

日志

 
 

C++程序出现“double free or corruption”问题  

2012-11-10 16:30:15|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
问题出现:最近编写C++ 多线程程序,在动态更改程序参数时出现“double free or corruption”
       的情况,一时摸不着头脑,怀疑是new、delete的问题,以及线程间同步的问题,结果把
       这两个方面查了个底朝天,没有把问题解决。
问题解决:最后将程序分解测试,发现存在一行memcpy代码,而其参数是一个复杂对象的地址,
       顿时眼前一亮,估计问题应该就出在这里了,修改后问题解决,哪位同仁commit的代码,可
       把我苦着了。
解释:       memcpy相当于对对象进行了浅拷贝,如果对象内都是基本类型,不会存在问题,但
       如果存在像string这样的对象或其他对象的指针,就会存在问题了,当拷贝的结构进行释放
       时,就会把源对象的内容释放掉,从而导致问题的出现。
简单示例
#include <iostream>
#include <string>
using namespace std;
 
#include <string.h>
 
typedef struct __test_struct1
{
    int data1;
    string data4;
} test_struct1;
 
int main()
{
    test_struct1 struct1;
    test_struct1 struct2;
    struct1.data4 = "abcdefgh";
    cerr << "struct1.data4:" << struct1.data4 << endl;
    memcpy(&struct2, &struct1, sizeof(struct1));
    cerr << "struct2.data4:" << struct2.data4 << endl;
    return 0;
}


运行程序后输出如下
zjx@byxc-PDSML:~/tmp$ ./a.out
struct1.data4:abcdefgh
struct2.data4:abcdefgh
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x086ec008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6ebc2)[0xa9ebc2]
/lib/i386-linux-gnu/libc.so.6(+0x6f862)[0xa9f862]
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0xaa294d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0x2d780f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1b)[0x2bec4b]
/usr/lib/i386-linux-gnu/libstdc++.so.6(+0x94c8c)[0x2bec8c]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x2e)[0x2becfe]
./a.out[0x80489ea]
./a.out[0x8048934]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xa49113]
./a.out[0x80487c1]
======= Memory map: ========
00218000-00219000 r-xp 00000000 00:00 0          [vdso]
0022a000-00308000 r-xp 00000000 08:01 9180539    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
00308000-00309000 ---p 000de000 08:01 9180539    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
00309000-0030d000 r--p 000de000 08:01 9180539    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
0030d000-0030e000 rw-p 000e2000 08:01 9180539    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
0030e000-00315000 rw-p 00000000 00:00 0
00356000-0037e000 r-xp 00000000 08:01 5243843    /lib/i386-linux-gnu/libm-2.13.so
0037e000-0037f000 r--p 00028000 08:01 5243843    /lib/i386-linux-gnu/libm-2.13.so
0037f000-00380000 rw-p 00029000 08:01 5243843    /lib/i386-linux-gnu/libm-2.13.so
005a8000-005c4000 r-xp 00000000 08:01 5243834    /lib/i386-linux-gnu/libgcc_s.so.1
005c4000-005c5000 r--p 0001b000 08:01 5243834    /lib/i386-linux-gnu/libgcc_s.so.1
005c5000-005c6000 rw-p 0001c000 08:01 5243834    /lib/i386-linux-gnu/libgcc_s.so.1
00a30000-00ba6000 r-xp 00000000 08:01 5243813    /lib/i386-linux-gnu/libc-2.13.so
00ba6000-00ba8000 r--p 00176000 08:01 5243813    /lib/i386-linux-gnu/libc-2.13.so
00ba8000-00ba9000 rw-p 00178000 08:01 5243813    /lib/i386-linux-gnu/libc-2.13.so
00ba9000-00bac000 rw-p 00000000 00:00 0
00d45000-00d63000 r-xp 00000000 08:01 5243800    /lib/i386-linux-gnu/ld-2.13.so
00d63000-00d64000 r--p 0001d000 08:01 5243800    /lib/i386-linux-gnu/ld-2.13.so
00d64000-00d65000 rw-p 0001e000 08:01 5243800    /lib/i386-linux-gnu/ld-2.13.so
08048000-08049000 r-xp 00000000 08:01 5122301    /home/zjx/tmp/a.out
08049000-0804a000 r--p 00000000 08:01 5122301    /home/zjx/tmp/a.out
0804a000-0804b000 rw-p 00001000 08:01 5122301    /home/zjx/tmp/a.out
086ec000-0870d000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b7754000-b7757000 rw-p 00000000 00:00 0
b7769000-b776b000 rw-p 00000000 00:00 0
bfc44000-bfc65000 rw-p 00000000 00:00 0          [stack]
Aborted

GDB 调用栈显示情况如下
Program received signal SIGABRT, Aborted.
0x00130416 in __kernel_vsyscall ()
(gdb) bt
#0  0x00130416 in __kernel_vsyscall ()
#1  0x00267c8f in raise () from /lib/i386-linux-gnu/libc.so.6
#2  0x0026b2b5 in abort () from /lib/i386-linux-gnu/libc.so.6
#3  0x0029ddfc in ?? () from /lib/i386-linux-gnu/libc.so.6
#4  0x002a8bc2 in ?? () from /lib/i386-linux-gnu/libc.so.6
#5  0x002a9862 in ?? () from /lib/i386-linux-gnu/libc.so.6
#6  0x002ac94d in free () from /lib/i386-linux-gnu/libc.so.6
#7  0x001de80f in operator delete(void*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#8  0x001c5c4b in std::string::_Rep::_M_destroy(std::allocator<char> const&) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#9  0x001c5c8c in ?? () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#10 0x001c5cfe in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#11 0x080489ea in __test_struct1::~__test_struct1 (this=0xbffff6f0, __in_chrg=<optimized out>) at struct_test.cpp:7
#12 0x08048934 in main () at struct_test.cpp:15
  评论这张
 
阅读(4896)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017