2014-11-16 91 views
2

在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(“”);

究竟发生了什么以及如何解决?

+1

“究竟发生了什么”是你的程序有一个bug。你的程序正在调用一个'convertTypeToText'函数,我们不知道它的功能。我们也不知道'recp'是什么,你是否用2增加了副作用,等等。然后你有未知的......我们不知道的东西。 – PaulMcKenzie

+0

你能复制一个可编译的例子吗? – IllusiveBrian

+0

'问题是字符串变量行是堆栈上的一个临时自动变量# – PaulMcKenzie

回答

0

这里这条线可能是坏

memcpy(&typec, recp, 2); 

你肯定RECP至少为2个字节长?

的回报通常崩溃意味着记忆是return语句

+0

不太可能成为问题;它应该明确地是2个字节。 (指向uint16_t的指针) – seand

+1

如果recp为null,那么这可能会损坏内存而不会立即崩溃 – Eric

+0

@Eric如果recp为null,那么'memcpy'应该立即segfault,否? –

0

在功能过程中被损坏,不一定在你的memcpy(& typec,RECP,2);

typec究竟是什么?它应该是一个指向保存目标的缓冲区的指针,但你只是给它一个指向short int的指针。这就是我所说的代码味道。 (其实我不认为这是问题)

+0

memcpy正在解码来自服务器的响应,它是2个八位字节。我实际上做了ntohs(),但是为了简单起见,这样做并不合适。 –

+0

可能'recp'可能为空吗? memcpy可能不会那样。好吧,它可能是memcpy是可以的,因为它应该显式地有一个2字节的目的地。那么convertTypeToText()里面的东西呢? – seand