在Linux Mint 17 32位计算机上使用g ++ v4.8.2,以下工作正常。在32位Ubuntu 12.04上也可以正常工作。C++返回字符串导致free():无效指针错误
...
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;
}
但是用克++ 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(“”);
究竟发生了什么以及如何解决?
“究竟发生了什么”是你的程序有一个bug。你的程序正在调用一个'convertTypeToText'函数,我们不知道它的功能。我们也不知道'recp'是什么,你是否用2增加了副作用,等等。然后你有未知的......我们不知道的东西。 – PaulMcKenzie
你能复制一个可编译的例子吗? – IllusiveBrian
'问题是字符串变量行是堆栈上的一个临时自动变量# – PaulMcKenzie