c ++ return string导致free():指针错误无效

时间:2014-11-16 02:16:21

标签: c++ string pointers return

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

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

2 个答案:

答案 0 :(得分:0)

这一行可能不好

memcpy(&typec, recp, 2);

你确定recp至少有2个字节吗?

通常在返回时崩溃意味着在函数期间内存已损坏,不一定在返回语句

期间

答案 1 :(得分:0)

在你的memcpy(& typec,recp,2);

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