【发布时间】: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.
使用分配检查内存显示对象分配在0x7fe71ac0cf00 和0x7fe71ac0cf10,而不是0x7fe71ac0cf08,因此看起来像是某种内存损坏。我什至不确定为什么在 C++ 函数中调用 free 。此外,这似乎只发生在某些回调中而不是其他回调。
关于如何调试 C 和 C++ 接口上发生的事情有什么建议吗?直接在代码中检测或通过 Xcode 的 Instruments 检测是最方便的,但我会尝试任何方法。谢谢!
【问题讨论】:
-
这可能是指针所有权的问题:您释放了库拥有的指针,或者库释放了您拥有的指针(两种情况都会导致相同的结果)。您能否向我们提供有关代码中动态对象所有权的更多信息?更具体地说:谁分配
input和data,是你还是图书馆?谁释放了这些指针,何时释放? -
你告诉编译器该函数是'C'代码,然后在函数中使用了一些仅C++的代码,当然函数失败了。
-
无论是否包含
extern "C",都会出现错误——正在发生更病态的事情。 -
Daniel --
input由 C 库分配和释放,而data由用户分配和释放,仅作为指针传递到 C 库。似乎 C 库回调中存在内存错误,我正在尝试诊断。 -
Daniel,根据 valgrind 的诊断,情况似乎确实如此,但更深层次的检查正在死亡,所以追踪这个过程将是一个令人讨厌的过程。谢谢!