【问题标题】:c++ return string causes free(): invalid pointer errorc++返回字符串导致free():无效指针错误
【发布时间】: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


【解决方案1】:

这里的这条线可能不好

memcpy(&typec, recp, 2);

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

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

【讨论】:

  • 不太可能是问题;它应该明确地是 2 个字节。 (指向 uint16_t 的指针)
  • 如果 recp 为空,那么这可能会损坏内存而不会立即崩溃
  • @Eric 如果recp 为空,那么memcpy 应该立即出现段错误,不是吗?
  • 是的,null 可能会崩溃,但删除的内存或稍微超出范围可能不会
【解决方案2】:

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

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

【讨论】:

  • memcpy 正在解码来自服务器的响应,该响应为 2 个八位字节。我实际上在它上面做了 ntohs() 但为了简单起见把它省略了。
  • 'recp' 是否可能为空? memcpy 可能不喜欢那样。好的,memcpy 很可能没问题,因为它应该明确地有一个 2 字节的目标。 convertTypeToText() 里面的东西呢?
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2018-06-18
相关资源
最近更新 更多