2017-11-09 5 views
1

は私のコードです:C.CStringによって割り当てられたメモリを解放するにはどうすればよいですか?ここ

helloworld.go

src/helloworld.go:9:2: could not determine kind of name for C.free 

をこの記事に基づいて:私が得たエラーの

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() {} 

一つhttps://blog.golang.org/c-go-cgo

私はまた、私は#include <stdlib.h>をCファイルの先頭に追加する必要があることを知りました。

helloworld.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なしで。私はそれをすることができます。私はちょうどメモリリークまたはいくつかの他の問題を引き起こすことを心配しています。

答えて

0

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() {} 
+0

しかし、今、私は、ランダムな文字列を取得しています。 https://stackoverflow.com/questions/47194827/getting-unreadable-string-from-my-node-js-extension-made-with-golangところで助けてくれてありがとう。 – jnbdz

関連する問題