【问题标题】:Diagnosing memory corruption from a C callback in C++ code从 C++ 代码中的 C 回调诊断内存损坏
【发布时间】:2016-01-25 00:27:29
【问题描述】:

我正在尝试在某些 C++ 代码中调用 C 库。为简单起见,假设 C 库的行为为

utility_class data;
callback(double input[], void* data);

void* mem;
c_library_init(mem);
c_library_data(mem, &data);
c_library_callback(mem, &callback);
c_library_action(mem);
c_library_free(mem);

然后我将 C++ 中的回调定义为

extern "C"
void callback(double input[], void* data) {
}

如果callback 为空,则代码运行良好,但如果我尝试分配标准向量,

extern "C"
void callback(double input[], void* data) {
  std::vector<double> temp(5);
}

然后我得到一个 malloc 错误(c_library_callback 显然调用 callback 至少一次没有问题,但在两次或三次调用后出错),

main(33158,0x7fff75ea5310) malloc: *** error for object 0x7fe71ac0cf08:  
incorrect checksum for freed object - object was probably modified after being
freed.

使用分配检查内存显示对象分配在0x7fe71ac0cf000x7fe71ac0cf10,而不是0x7fe71ac0cf08,因此看起来像是某种内存损坏。我什至不确定为什么在 C++ 函数中调用 free 。此外,这似乎只发生在某些回调中而不是其他回调。

关于如何调试 C 和 C++ 接口上发生的事情有什么建议吗?直接在代码中检测或通过 Xcode 的 Instruments 检测是最方便的,但我会尝试任何方法。谢谢!

【问题讨论】:

  • 这可能是指针所有权的问题:您释放了库拥有的指针,或者库释放了您拥有的指针(两种情况都会导致相同的结果)。您能否向我们提供有关代码中动态对象所有权的更多信息?更具体地说:谁分配 inputdata ,是你还是图书馆?谁释放了这些指针,何时释放?
  • 你告诉编译器该函数是'C'代码,然后在函数中使用了一些仅C++的代码,当然函数失败了。
  • 无论是否包含extern "C",都会出现错误——正在发生更病态的事情。
  • Daniel -- input 由 C 库分配和释放,而 data 由用户分配和释放,仅作为指针传递到 C 库。似乎 C 库回调中存在内存错误,我正在尝试诊断。
  • Daniel,根据 valgrind 的诊断,情况似乎确实如此,但更深层次的检查正在死亡,所以追踪这个过程将是一个令人讨厌的过程。谢谢!

标签: c++ c memory callback


【解决方案1】:

您可以在 Mac 上试用 valgrind。诊断与内存访问和修改相关的问题对我非常有帮助。

这里是 Mac 上install valgrind 的更多信息。

【讨论】:

    【解决方案2】:

    malloc 只是检测到问题的地方,而不是问题的根源。在代码的其他地方,您写入已释放的内存。这可能很难追踪,但如果您检查释放后写入的内存(上面示例中的0x7fe71ac0cf08)以查看写入了哪些数据,您可能会知道问题出在哪里。可能介于最后一个有效的 callback 调用和失败的调用之间。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多