cgo调用内存泄露

阅读 126 次  3 条评论
package main /* #include <stdlib.h> #include <malloc.h> void mal(char **p) { int l = 1000000; *p= (char *)malloc(l); *(*p+l-2) = 'a'; *(*p+l-1) = 'b'; } */ import "C" import ( "fmt" "sync" "time" "unsafe" ) func main() { time.Sleep(time.Second * 10) var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { var p *C.char C.mal(&p) defer C.free(unsafe.Pointer(p)) l := 1000000 ss := C.GoStringN(p, C.int(l)) if string(ss[l-2:]) != "ab" { fmt.Println("not ab") } wg.Done() }() } wg.Wait() fmt.Println("complete!") time.Sleep(time.Second * 300) } C.GoStringN(p, C.int(l))会产生内存泄露,生成的string不会被GC,大家有遇到这个情况吗

3条回复

主题回复:

(您需要 登录 后才能回复 没有账号 ?)
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet