Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的应用程序在释放由CFFI生成的DLL分配的字符*时崩溃?_Python_C++_Memory_Python Cffi - Fatal编程技术网

Python 为什么我的应用程序在释放由CFFI生成的DLL分配的字符*时崩溃?

Python 为什么我的应用程序在释放由CFFI生成的DLL分配的字符*时崩溃?,python,c++,memory,python-cffi,Python,C++,Memory,Python Cffi,我正在使用CFFI生成DLL: 导入cffi ffibuilder=cffi.FFI() ffibuilder.embedding_api(“”) char*get_string(); ''') ffibuilder.set_source('my_plugin','') ffibuilder.embedding_init_代码(“”) 从my_插件导入ffi,lib @外国金融机构定义(外部) def get_字符串(): val=“字符串” 返回lib.strdup(val.encode())

我正在使用CFFI生成DLL:

导入cffi
ffibuilder=cffi.FFI()
ffibuilder.embedding_api(“”)
char*get_string();
''')
ffibuilder.set_source('my_plugin','')
ffibuilder.embedding_init_代码(“”)
从my_插件导入ffi,lib
@外国金融机构定义(外部)
def get_字符串():
val=“字符串”
返回lib.strdup(val.encode())
''')
ffibuilder.cdef(“”)
字符*strdup(常量字符*);
''')
编译(target='my-plugin.*',verbose=True)
我通过运行前面的脚本生成DLL。现在,我创建了这个C++代码示例,使用我的DLL:

#包括
#包括
typedef char*(u stdcall*获取字符串)();
int main()
{
HINSTANCE hGetProcIDDLL=LoadLibrary(“my plugin.dll”);
如果(!hGetProcIDDLL){

std::cout在一个位置分配然后跨DLL边界释放是一种危险的做法。除非您知道自己做得对(相同的CRT版本等),否则请避免:

当您将C运行时(CRT)对象(如文件句柄、区域设置和环境变量)传入或传出DLL(跨DLL边界的函数调用)时,如果DLL以及调用DLL的文件使用CRT库的不同副本,则可能会发生意外行为

当您分配内存(显式使用new或malloc,或隐式使用strdup、strstrstreambuf::str等)然后跨DLL边界传递要释放的指针时,可能会出现相关问题。如果DLL及其用户使用CRT库的不同副本,则可能会导致内存访问冲突或堆损坏


一个解决方案是从正在分配对象的DLL中公开<>代码>免费/<代码>函数,以便客户端可以在其上调用您的“代码>免费/代码>函数,或者C++中,您可以使用自定义指针的智能指针来正确地执行它。

< P>在一个地方分配然后自由地跨DLL BUB是一种危险的做法。ndary.除非你知道自己做得对,否则不要使用它(相同的CRT版本等):

当您将C运行时(CRT)对象(如文件句柄、区域设置和环境变量)传入或传出DLL(跨DLL边界的函数调用)时,如果DLL以及调用DLL的文件使用CRT库的不同副本,则可能会发生意外行为

当您分配内存(显式使用new或malloc,或隐式使用strdup、strstrstreambuf::str等)然后跨DLL边界传递要释放的指针时,可能会出现相关问题。如果DLL及其用户使用CRT库的不同副本,则可能会导致内存访问冲突或堆损坏


一个解决方案是从正在分配对象的DLL中公开<代码>免费//>函数,以便客户端可以在上面调用您的<代码>免费>代码>函数,或者C++中您可以使用自定义指针的智能指针来正确地执行。

我按照您所说的进行。它工作正常,但现在我有一个奇怪的错误。我更新了我的Goice。声明。@Pierre:我认为这是一个与你第一个问题截然不同的问题,因为它现在是一个Python问题,而不是C++/DLL问题。如果你最初的问题已经解决,你应该结束这个问题。然后从谷歌搜索“Python”MemoryError:Stack overflow“”(带双引号)开始,你应该找到其他有同样问题的人。如果这不能让你找到解决方案,请在上面贴一个新问题。我在其他地方没有找到答案。我在这里问了一个新问题:我按照你说的做。效果很好,但我现在有一个奇怪的错误。我更新了我的问题。@Pierre:我认为这是一个与你的问题非常不同的问题st,因为它现在是一个Python问题,而不是C++/DLL问题。如果您最初的问题已经解决,您应该结束这个问题。然后通过谷歌搜索“Python”MemoryError:Stack overflow“”(带双引号)开始,你应该找到其他有同样问题的人。如果这不能让你找到解决方案,请在上面发布一个新问题。我在其他地方没有找到答案。我在这里问了一个新问题:
> cl get_string.cpp
Compilateur d'optimisation Microsoft (R) 32 bits C/C++ version 16.00.40219.01 pour 80x86
Copyright (C) Microsoft Corporation. Tous droits réservés.

get_string.cpp
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xlocale(323) : warning C4530: Gestionnaire d'exceptions C++ utilisé, mais les sémantiques de déroulement n'ont pas été activées. Spécifiez /EHsc
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:get_string.exe
get_string.obj

> get_string.exe
Value = string