我希望使用CGO调用一个优化的C++ CPU密集型算法实现,从golang中传递一个字符串到c++函数并获得一个字符串返回。下面是代码的简化版本:
algo.go
package main
//#cgo LDFLAGS:
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//char* echo(char* s);
import "C"
import "unsafe"
func main() {
cs := C.CString("Hello from stdio\n")
defer C.free(unsafe.Pointer(cs))
var echoOut *C.char = C.echo(cs)
//defer C.free(unsafe.Pointer(echoOut)); -> using this will crash the code
fmt.Println(C.GoString(echoOut));
}
algo.cpp
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
using namespace std;
extern "C" {
char* echo(char* o) {
int len = sizeof(o) / sizeof(char);
char* out = (char*)malloc(len * sizeof(char));
strcpy(out, o);
return out;
}
}
在这个链接中,人们提到C++代码应该自己调用“free”来释放已分配的内存:http://grokbase.com/t/gg/golang-nuts/149hxezftf/go-nuts-cgo-is-it-safe-to-malloc-and-free-in-seperate-c-functions。但是因为我的C++函数返回了一个分配的指针,以便Golang可以得到结果,所以这非常棘手。我不能在C++代码中调用free吗?正确处理这种情况的方法是什么?我有一个Web服务器会在每个请求中调用C++代码,并希望确保它不会引入任何内存泄漏。
谢谢。
C.free
会使代码崩溃。错误是什么?堆栈跟踪是什么样子的?在 Go 中调用C.free
就像在 C 中调用它一样。你必须知道谁负责释放内存,以及什么时候安全地进行释放。 - JimB