首页 > 后端开发 > Golang > 正文

Go:返回 CString 时如何处理内存泄漏?

王林
发布: 2024-02-13 10:00:10
转载
949 人浏览过

Go:返回 CString 时如何处理内存泄漏?

php小编西瓜在这里为大家分享关于Go语言中处理返回CString时的内存泄漏问题的解决方法。在Go语言中,C字符串是以null结尾的字节数组,而Go语言的字符串是以长度为前缀的字节数组。当我们需要将Go字符串转换为C字符串并返回时,需要注意内存的分配和释放,以避免内存泄漏问题的发生。本文将介绍几种处理内存泄漏的方法,帮助大家解决这个常见的问题。

问题内容

我有以下函数签名,然后返回 json 字符串

func getdata(symbol, day, month, year *c.char) *c.char {
  combine, _ := json.marshal(combinerecords)
  log.println(string(combine))
  return c.cstring(string(combine))
}
登录后复制

然后在 python 中调用 go 代码

import ctypes
from time import sleep
library = ctypes.cdll.LoadLibrary('./deribit.so')
get_data = library.getData

# Make python convert its values to C representation.
# get_data.argtypes = [ctypes.c_char_p, ctypes.c_char_p,ctypes.c_char_p,ctypes.c_char_p]
get_data.restype = ctypes.c_char_p

for i in range(1,100):
    j= get_data("BTC".encode("utf-8"), "5".encode("utf-8"), "JAN".encode("utf-8"), "23".encode("utf-8"))
    # j= get_data(b"BTC", b"3", b"JAN", b"23")
    print('prnting in Python')
    # print(j)
    sleep(1)
登录后复制

它在 python 端工作得很好,但我担心当在 python 端循环调用该函数时会出现内存泄漏。

如何处理内存泄漏?我应该返回 bytes 而不是 cstring 并在 python 端处理字节以避免内存泄漏吗?我确实找到了这个链接来处理它,但不知何故我不知道编组后返回的 json 字符串的大小

解决方法

python 应该如下所示:

import ctypes
from time import sleep
library = ctypes.cdll('./stackoverflow.so')
get_data = library.getdata
free_me = library.freeme
free_me.argtypes = [ctypes.pointer(ctypes.c_char)]
get_data.restype = ctypes.pointer(ctypes.c_char)

for i in range(1,100):
  j = get_data("", "", "")
  print(ctypes.c_char_p.from_buffer(j).value)
  free_me(j)
  sleep(1)
登录后复制

go 应该是这样的:

package main
/*
#include <stdlib.h>
*/
import "c"
import (
  "log"
  "unsafe"
)

//export getdata
func getdata(symbol, day, month, year *c.char) *c.char {
  combine := "combine"
  log.println(string(combine))
  return c.cstring(string(combine))
}

//export freeme
func freeme(data *c.char) {
  c.free(unsafe.pointer(data))
}

func main() {}
登录后复制

并使用此命令行生成共享库:

python3 --version
python 3.8.10 
go version
go version go1.19.2 linux/amd64
go build -o stackoverflow.so -buildmode=c-shared github.com/sjeandeaux/stackoverflow
python3 stackoverflow.py 
2023/01/03 13:54:14 combine
b'combine'                                                                                                                                  
...
登录后复制
from ubuntu:18.04

run apt-get update -y && apt-get install python -y

copy stackoverflow.so stackoverflow.so
copy stackoverflow.py stackoverflow.py

cmd ["python", "stackoverflow.py"]
登录后复制
docker build --tag stackoverflow .
docker run -ti stackoverflow
2023/01/03 15:04:24 combine
b'combine'
...
登录后复制

以上是Go:返回 CString 时如何处理内存泄漏?的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!