gpt4 book ai didi

c++ - 使用调试版本在 C API 上调用 delete 到 C++ 接口(interface)段错误

转载 作者:太空狗 更新时间:2023-10-29 21:14:47 26 4
gpt4 key购买 nike

我遇到了一个问题,我有一些包装 C++ 类的代码,如下所示:

C++:

class A
{
A() {}
~A() {}
}

C 接口(interface):

typedef struct c_a c_a;
void c_a_new(c_a * self)
{
self = reinterpret_cast<c_a *>(new A());
}
void c_a_delete(c_a * self)
{
delete reinterpret_cast<A*>(self);
}

C 代码:

c_a * self;
c_a_new(self);
c_a_delete(self);

我正在使用 CMake 作为构建系统使用 gcc 进行构建。当 CMAKE_BUILD_TYPE 设置为 ReleaseRelWithDebInfo 时一切正常,但我在调用 c_a_delete(self); 时遇到段错误code> 当它设置为 Debug 时。这似乎发生在我使用 C 接口(interface)的所有类上。如果我注释掉 c_a_delete() 中的 delete 调用,它似乎可以解决这个问题。我想这可能会导致内存泄漏。编译器是否有可能优化发布版本中的内存使用或是否有其他事情发生?

最佳答案

您正在按值传递指针,而不是更新原始指针。使用返回值或指向指针的指针。 (我还添加了一个额外的句柄 typedef 以使其与其他 C api 更加同步)

typedef struct c_a c_a, *a_handle;
void c_a_new(a_handle* self)
{
*self = reinterpret_cast<a_handle>(new A());
}
void c_a_delete(a_handle self)
{
delete reinterpret_cast<A*>(self);
}

然后调用

a_handle self;
c_a_new(&self);
c_a_delete(self);

或者直接返回获取的指针:

typedef struct c_a c_a, *a_handle;
a_handle c_a_new(a_handle* self)
{
return reinterpret_cast<a_handle>(new A());
}
void c_a_delete(a_handle self)
{
delete reinterpret_cast<A*>(self);
}

并像这样使用它:

a_handle self = c_a_new();
c_a_delete(self);

关于c++ - 使用调试版本在 C API 上调用 delete 到 C++ 接口(interface)段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39841821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com