从C+中的C回调诊断内存损坏+;代码 我试图在某些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) { }

从C+中的C回调诊断内存损坏+;代码 我试图在某些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) { },c++,c,memory,callback,C++,C,Memory,Callback,如果callback为空,则代码运行正常,但如果我尝试分配标准向量 extern "C" void callback(double input[], void* data) { std::vector<double> temp(5); } 通过分配检查内存显示对象是在0x7fe71ac0cf00和0x7fe71ac0cf10分配的,但不是在0x7fe71ac0cf08分配的,因此看起来像是某种内存损坏。我甚至不知道为什么C++中调用了免费。此外,这似乎只发生在一些回调中,而不是

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

extern "C"
void callback(double input[], void* data) {
  std::vector<double> temp(5);
}
通过分配检查内存显示对象是在
0x7fe71ac0cf00
0x7fe71ac0cf10
分配的,但不是在
0x7fe71ac0cf08
分配的,因此看起来像是某种内存损坏。我甚至不知道为什么C++中调用了免费。此外,这似乎只发生在一些回调中,而不是其他回调


关于如何调试C和C++接口上的问题有什么建议?直接在代码中或通过Xcode的工具进行诊断是最方便的,但我会尝试任何方法。谢谢

malloc仅仅是检测到问题的地方,而不是问题的根源。在代码的其他地方,您将写入已释放的内存。这可能很难追踪,但如果您检查空闲后写入的内存(
0x7fe71ac0cf08
,在上面的示例中),以查看写入的数据,您可能会找到问题所在的线索。可能在上次
回调
成功和失败之间。

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


以下是有关Mac的更多信息。

可能是指针所有权的问题:您释放了库拥有的指针,或者库释放了您拥有的指针(这两种情况都会导致相同的结果)。您能为我们提供更多关于代码中动态对象所有权的信息吗?更具体地说:谁分配
输入
数据
,是您还是库?谁释放了这些指针,什么时候?你告诉编译器函数是“C”代码,然后在函数中使用了一些C++代码,当然函数失败了。被包括在内——更病态的事情正在发生。Daniel--
输入由C库分配和释放,而
数据由用户分配和释放,仅作为指针传递到C库。我试图诊断的C库回调中似乎存在内存错误。Daniel,根据valgrind的诊断,情况似乎确实如此,但更深层次的检查正在消失,因此跟踪这一点将是一个令人讨厌的过程。谢谢
main(33158,0x7fff75ea5310) malloc: *** error for object 0x7fe71ac0cf08:  
incorrect checksum for freed object - object was probably modified after being
freed.