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可以进行所有循环(但不释放内存)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值