go - 如何释放C.CString分配的内存?

原文 标签 go cgo

这是我的代码:
地狱世界:前往:

package main

import "C"
import "unsafe"

//export HelloWorld
func HelloWorld() *C.char {
    cs := C.CString("Hello World!")
    C.free(unsafe.Pointer(cs))
    return cs
}

func main() {}

其中一个错误是:
src/helloworld.go:9:2: could not determine kind of name for C.free

基于本文:https://blog.golang.org/c-go-cgo
我还发现我需要在我的C文件的顶部添加#include <stdlib.h>
地狱世界H:
#include <stdlib.h>
/* Created by "go tool cgo" - DO NOT EDIT. */

/* package command-line-arguments */

/* Start of preamble from import "C" comments.  */




/* End of preamble from import "C" comments.  */


/* Start of boilerplate cgo prologue.  */
#line 1 "cgo-gcc-export-header-prolog"

#ifndef GO_CGO_PROLOGUE_H
#define GO_CGO_PROLOGUE_H

typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;

/*
  static assertion to make sure the file is being used on architecture
  at least with matching size of GoInt.
*/
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];

typedef struct { const char *p; GoInt n; } GoString;
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

#endif

/* End of boilerplate cgo prologue.  */

#ifdef __cplusplus
extern "C" {
#endif


extern char* HelloWorld();

#ifdef __cplusplus
}
#endif

我尝试过但没有成功。
我需要释放记忆。
我该怎么做?因为在这里的例子中,它打印出字符串。我想还它。没有C.free。我能做到。我只是担心引起记忆泄漏或其他问题。

最佳答案

Command cgo

// Go string to C string
// The C string is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CString(string) *C.char

如果“c”的导入前面紧跟一个注释,则
在编译C时,将注释(称为前导码)用作头。
包装的一部分。
例如,
package main

/*
#include <stdlib.h>
*/
import "C"

import "unsafe"

//export HelloWorld
func HelloWorld() *C.char {
    cs := C.CString("Hello World!")
    C.free(unsafe.Pointer(cs))
    return cs
}

func main() {}

相关文章:

postgresql - 如何使用cgo构建Postgres扩展

go - 如何在cgo中正确使用64位TDM-GCC? [重复]

multithreading - 使用Go 1.2的线程CGO

go - 使用C类型作为参数的导出函数类型时遇到问题

class - 去,在struct中如何引用当前对象(在java和c ++中这样)?

go - 单值上下文中的多值(go)

networking - 拨打特定的地址/接口? Golang

go - go - golang编译错误:type没有方法

go - 使用Go语言创建列表列表

c - cgo结果已经指针