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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

GoLand中自定义结构体标签不显示怎么办?在使用GoLand进行Go语言开发时,很多开发者会遇到自定义结构体标签在�...

是的,H5页面制作是前端开发的重要实现方式,涉及HTML、CSS和JavaScript等核心技术。开发者通过巧妙结合这些技术,例如使用<canvas>标签绘制图形或使用JavaScript控制交互行为,构建出动态且功能强大的H5页面。

CSS自定义resize符号的方法与背景色统一在日常开发中,我们经常会遇到需要自定义用户界面细节的情况,比如调...

如何使用JavaScript或CSS控制浏览器打印设置中的页首和页尾在浏览器的打印设置中,有一个选项可以控制是否显�...

关于inline-block元素错位显示的原因及解决方案在编写网页布局时,我们常常会遇到一些看似奇怪的显示问题。比...

如何实现分段器的45度曲线效果?在实现分段器的过程中,如何让点击左侧按钮时右侧边框变成45度曲线,而点�...

Go语言中哪些库是大公司开发或知名开源项目?在使用Go语言进行编程时,开发者常常会遇到一些常见的需求,�...
