为了账号安全,请及时绑定邮箱和手机立即绑定

在 cgo、golang 中使用 free 时获得双重释放或损坏(退出)

在 cgo、golang 中使用 free 时获得双重释放或损坏(退出)

Go
慕斯王 2021-12-13 18:52:13
我正在尝试理解和学习 cgo,作为其中的一部分,我编写了一个使用C.stat.import (    "fmt"    "unsafe"    "os")//#include <sys/stat.h>//#include <stdlib.h>import "C"func CheckPerm(filename string) {    statt := C.stat //stat struct from C    path := C.CString(filename)    st := *(*C.struct_stat)(unsafe.Pointer(statt)) //Casting unsafe pointer to C.struct_stat    defer C.free(unsafe.Pointer(path)) //free    defer C.free(unsafe.Pointer(statt))    C.stat(path, &st)    if st.st_mode & C.S_IRGRP > 0 || st.st_mode & C.S_IWGRP > 0 || st.st_mode & C.S_IXGRP > 0 || st.st_mode & C.S_IROTH > 0 || st.st_mode & C.S_IWOTH > 0 || st.st_mode & C.S_IXOTH > 0 {        fmt.Println("file permission too broad, make it non-readable to groups and others.")        os.Exit(1)    }    fmt.Println("File permission looks fine")}将文件路径传递给函数后,它会出错说*** Error in `/tmp/Build go-sync.go and run77go': double free or corruption (out): 0x0000000000609480 ***SIGABRT: abortPC=0x7fe4302f3267 m=0signal arrived during cgo executiongoroutine 1 [syscall, locked to thread]:runtime.cgocall(0x401930, 0xc820097808, 0xc800000000)/usr/lib/go/src/runtime/cgocall.go:120 +0x11b fp=0xc8200977d8 sp=0xc8200977a8gosyncmodules._Cfunc_free(0x609480)==========snip============由于最后一行粘贴在这里gosyncmodules._Cfunc_free(0x609480),我删除了defer C.free(unsafe.Pointer(statt))它,现在它工作正常。为什么当我尝试释放创建的结构时会抛出错误,而它可用于释放路径变量?如果不是在这种情况下,类似的情况会导致内存泄漏吗?
查看完整描述

1 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

来自https://golang.org/cmd/cgo/#hdr-Go_references_to_C:


// 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

你的


path := C.CString(filename)

制作一个副本,你必须释放它,而它statt是一个普通的 Go 内存管理变量。


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 633 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信