【发布时间】:2015-01-13 04:53:45
【问题描述】:
在 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()。在调试过程中,我也看到了这个错误:“double free or corruption”。
是不是字符串变量line是栈上的临时自动变量,return搞乱了? 如果是这样,纠正这个问题的最佳方法是什么?
我应该做“静态字符串线;”吗? 或者使用实例变量来保持线? 或者使用字符串 line = new("");
到底发生了什么,我该如何解决?
【问题讨论】:
-
“到底发生了什么”是您的程序有错误。你的程序正在调用一个函数
convertTypeToText,我们不知道它做了什么。我们也不知道recp是什么,你将它增加2 是否有不好的副作用等等。然后你有未知的...东西,我们不知道。 -
你能用一个可编译的例子复制这个吗?
-
Is the problem that the string variable line is a temporary automatic variable on the stack号 -
我认为代码没问题,因为它在两台不同的 32 位机器上运行良好。不同的是64位机器。我已经在返回之前打印了字符串,它看起来很好。
-
如果您的应用程序是从 32 位移植而来的 64 位应用程序,请注意类型之间可能存在大小差异,尤其是指针。如果您的代码假设指针的大小为
x字节,那么这是一个问题。此外,一般来说,如果一个程序无法在一个平台上运行,这可能意味着该程序总是有一个错误(或不正确的编码,幸运的是,它恰好适用于 32 位),但现在它被暴露了。
标签: c++ string pointers return