我正在尝试在Codeblocks(在mingw下使用GCC)中使用Visual Studio 2008 SP1创建的dll(启用了公共(public)语言运行时支持)。传递给 dll 的一些参数已由调用函数动态分配。我的问题是:
“传递给 dll 的参数能否驻留在调用函数的堆上。这样做安全吗?”
从 dll 返回时,调用函数的堆栈被损坏,并且在尝试访问这些堆栈时,当我尝试调试此问题时,我在代码块内收到 SIGTRAP。
这可能是什么原因?
dll函数的原型(prototype)如下:
int __cdecl myTesseractOCR(myOCRData* labels_for_ocr);
myOCRDaata 定义如下所示:
typedef struct __ocr_data
{
char* arr_image [NUMOBJ_LIMIT_HIGH];
int start_x [NUMOBJ_LIMIT_HIGH];
int start_y [NUMOBJ_LIMIT_HIGH];
int width [NUMOBJ_LIMIT_HIGH];
int height [NUMOBJ_LIMIT_HIGH];
int widthstep [NUMOBJ_LIMIT_HIGH];
char number_plate_buff [2*NUMOBJ_LIMIT_HIGH];
int ocr_label_count;
} myOCRData;
arr_image 指向驻留在调用函数堆上的数据,而上述结构的所有其他成员都驻留在调用函数的堆栈上。驻留在堆栈上的所有这些成员都会被损坏,并且程序会生成 SIGTRAP。我在 stackoverflow 上的各个线程中看到过此类问题的讨论,但尚未找到具体的解决方案。
最佳答案
我建议您使 DLL 接口(interface)尽可能扁平;即避免传递结构,即使它们是 POD。由于您使用的是 2 个不同的编译器,这一点尤其重要。如果您决定传递结构,请确保在两个编译器下显式定义结构的打包。
关于c - DLL 调用时堆/堆栈损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829392/