日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 堆栈溢出_python - 使用CFFI释放内存时,“ MemoryError:堆栈溢出”是什么意思? - 堆栈内存溢出...

發布時間:2025/3/15 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 堆栈溢出_python - 使用CFFI释放内存时,“ MemoryError:堆栈溢出”是什么意思? - 堆栈内存溢出... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這一個問題, 這一個 。

我使用CFFI創建DLL,并從C ++應用程序中調用它。 我在問自己如何找到釋放由DLL分配的內存的方法,我遵循@metal在其答案中提到的想法。

現在是我的Python代碼:

import cffi

ffibuilder = cffi.FFI()

ffibuilder.embedding_api('''

char* get_string();

void free_char(char*);

''')

ffibuilder.set_source('my_plugin', '')

ffibuilder.embedding_init_code('''

from my_plugin import ffi, lib

@ffi.def_extern()

def get_string():

val = "string"

return lib.strdup(val.encode())

@ffi.def_extern()

def free_char(ptr):

lib.free(ptr)

''')

ffibuilder.cdef('''

char *strdup(const char *);

void free(void *ptr);

''')

ffibuilder.compile(target='my-plugin.*', verbose=True)

而我的C ++代碼:

#include

#include

typedef char* (__stdcall *get_string_t)();

typedef void (__stdcall *free_char_t)(char*);

int main()

{

HINSTANCE hGetProcIDDLL = LoadLibrary("my-plugin.dll");

if (!hGetProcIDDLL) {

std::cout << "could not load the dynamic library" << std::endl;

return -1;

}

get_string_t get_string = (get_string_t)GetProcAddress(hGetProcIDDLL, "get_string");

if (!get_string) {

std::cout << "could not locate the function" << std::endl;

return -1;

}

free_char_t free_char = (free_char_t)GetProcAddress(hGetProcIDDLL, "free_char");

if (!free_char) {

std::cout << "could not locate the function" << std::endl;

return -1;

}

for(int i = 0; i < 25000000; i++)

{

char* val = NULL;

val = get_string();

if(i % 10000 == 0)

{

std::cout << "Value " << i << " = " << val << std::endl;

}

if(val)

free_char(val);

}

std::cout << "End" << std::endl;

return 0;

}

我得到這個結果:

Value 0 = string

Value 10000 = string

Value 20000 = string

Value 30000 = string

Value 40000 = string

Value 50000 = string

Value 60000 = string

Value 70000 = string

Value 80000 = string

Value 90000 = string

Value 100000 = string

Value 110000 = string

Value 120000 = string

Value 130000 = string

Value 140000 = string

Value 150000 = string

Value 160000 = string

Value 170000 = string

Value 180000 = string

Value 190000 = string

Value 200000 = string

Value 210000 = string

Value 220000 = string

Value 230000 = string

Value 240000 = string

Value 250000 = string

From cffi callback :

MemoryError: Stack overflow

From cffi callback :

From cffi callback :

From cffi callback :

From cffi callback :

這個錯誤是什么意思? 我沒有內存問題,因為我使用新的free_char函數釋放內存。 順便說一句,如果刪除對free_char的調用, free_char可以進行所有循環(但不釋放內存)。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的python 堆栈溢出_python - 使用CFFI释放内存时,“ MemoryError:堆栈溢出”是什么意思? - 堆栈内存溢出...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。