在 Go + SWIG + C++ 代码中清理内存管理

我正在通过 SWIG 使用来自 Go 的 C++ 库。SWIG 不负责内存管理,因此 Go 端看起来像这样:

f := NewFoo()
defer DeleteFoo(f)

DeleteFoo(f)当我创建时调用f它很容易,但是对于 C++ 函数的返回值很容易忽略它。

我想自动检查我的代码是否正确。

我看到 Address Sanitizer 是为 GCC 和 Clang 实现的,这听起来是正确的。但是我找不到一个明确的方法来为我的go test命令启用它。


哆啦的时光机
浏览 115回答 2
2回答

慕勒3428872

Defer在块内的工作(功能等)中非常有用。然而,这并不总是足够的。你需要什么runtime.SetFinalizer直接来说,我不认为你可以用 Go 来检查其他任何东西的内存状态。(所以在 C 或 C++ 中分配的内存。)如果我是你,我会将 C 代码的一部分编译为共享的。稍后我可以很容易地使用诸如 clang 之类的工具来检查这一点。如果你的 C 代码没有问题,你就无法干扰 Go 的 gc。

尚方宝剑之说

我认为CC="clang -fsanitize=address" go test或CC="gcc -fsanitize=address" go test应该工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go