我该如何创建一个包装器来释放不安全的人。指针在我的代码中?这是我的 cgo 代码:
//export clientpy
func clientpy(url *C.char, headersfrompy *C.char, proxy *C.char) unsafe.Pointer {
s := C.GoString(url)
headers := C.GoString(headersfrompy)
p := C.GoString(proxy)
request := UrlGet(s, headers, p)
length := make([]byte, 8)
binary.LittleEndian.PutUint64(length, uint64(len(request)))
return C.CBytes(append(length, request...))
}
//export FreeCByte
func FreeCByte(b *unsafe.Pointer) {
C.free(unsafe.Pointer(b))
}
似乎我无法释放python代码中的内存。我正在创建一个包装器,以便我可以在python中释放内存,而不是在go内部释放内存,这样我就不会有悬空的指针。
这是我的蟒蛇代码:
from ctypes import cdll
import ctypes, cchardet, json
from bs4 import BeautifulSoup
lib = cdll.LoadLibrary("./test.so")
lib.cclientpy.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
lib.cclientpy.restype = ctypes.POINTER(ctypes.c_ubyte * 8)
""" THERE IS A BIG MEMORY LEAK, BEWARE """
free = lib.free
free.argtypes = [ctypes.POINTER(ctypes.c_ubyte * 8)]
def newrequest(path, lister={}, proxy=[]):
try:
print(f"proxy: {proxy}")
ptr = lib.cclientpy(path.encode("utf-8"), str(lister).encode("utf-8"), str(proxy).encode("utf-8"))
length = int.from_bytes(ptr.contents, byteorder="little")
data = bytes(ctypes.cast(ptr,
ctypes.POINTER(ctypes.c_ubyte * (8 + length))
).contents[8:])
#free(ptr)
lib.FreeCByte(ptr)
print(f'bytes: {bytes(ctypes.cast(ptr,ctypes.POINTER(ctypes.c_ubyte * (8 + length))).contents[8:])}')
return data
except:
pass
如何释放不安全的指针?
心有法竹
相关分类