在Linux Mint 17 32位计算机上使用g ++ v4.8.2,以下工作正常。也可以在32位Ubuntu 12.04上正常工作。
...
string sdata;
sdata = decodeRec(bufp);
...
string Part::decodeRec(unsigned char *recp) {
string line="";
uint16_t typec;
memcpy(&typec, recp, 2);
recp += 2;
string sTypec = convertTypeToText(typec) + " ";
line += sTypec;
// ... decode more fields in record, add string values to line
return line;
}
但是使用g ++ 4.8.3转移到64位Fedora计算机时,程序崩溃了以下内容:
free(): invalid pointer: 0x000000000060f6e8 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3a08c75a4f]
/lib64/libc.so.6[0x3a08c7cd78]
/lib64/libstdc++.so.6(_ZNSsD1Ev+0x43)[0x3a170be1c3]
/home/myprogram[0x4072df]
...
这是'回归线';声明失败。它似乎有些字符串库例程试图多次释放指针。我的程序中没有执行任何malloc()或free()。在调试期间,我也看到了这个错误:“双重免费或腐败。”
字符串变量行是否是堆栈上的临时自动变量的问题,并且返回被搞砸了? 如果是这样,纠正这个问题的最佳方法是什么?
我应该做“静态字符串行”吗? 或者使用实例变量来保持线? 或者使用string line = new(“”);
究竟发生了什么以及如何解决?
答案 0 :(得分:0)
这一行可能不好
memcpy(&typec, recp, 2);
你确定recp至少有2个字节吗?
通常在返回时崩溃意味着在函数期间内存已损坏,不一定在返回语句
期间答案 1 :(得分:0)
在你的memcpy(& typec,recp,2);
什么是typec?它应该是指向保存目标的缓冲区的指针,但是 你只是给它一个指向短整数的指针。这就是我所说的代码味道。 (实际上我认为这不是问题)