从非托管库调用托管库时,c++ /CLI包装器内存泄漏
本文关键字:包装 CLI 内存 泄漏 调用 c++ | 更新日期: 2023-09-27 18:12:27
从非托管代码调用托管代码库时出现此错误:
运行时检查失败#2 -变量'BridgeObj'周围的堆栈已损坏。
我创建的代码是:
管理的自由:
<>之前使用系统;名称空间My.Name.Space{公共类{公共int请求(字符串xml_input,输出字符串xml_output){xml_output = "返回字符串";返回0;}}}之前
包装c++/CLI:
<>之前# include"stdafx.h"# include & lt; msclr ' auto_gcroot.h>#使用". . ' ' ManagedLib.dll"链接;使用namespace System::Runtime::InteropServices//元帅struct ManagedModul{公众:msclr: auto_gcroot<我::名称::空间::示例^祝辞SampleModul;};类__declspec(dllexport)>Request(gcnew System::String(xmlin), ps);* xmlout = (char*) (Marshal::StringToHGlobalAnsi(ps)).ToPointer();返回0;}};之前示例用法:
<>之前# include"stdafx.h"# include & lt; Windows.h>#pragma comment (lib, "…''link''Wrapper.lib")类桥{公众:桥();~桥();int Request (const char * xmllin, char * xmlout);};int _tmain(int argc, _TCHAR* argv[]){桥BridgeObj;char * buffer = NULL;BridgeObj.Request("aaaaa",,缓冲);LocalFree (buffer);返回0;}
class Bridge
{
public:
Bridge();
~Bridge();
int Request ( const char * xmlin, char ** xmlout );
};
这是一个非常,非常不好的做法。您没有使用在两个项目中都使用的.h文件,而是重新声明了Bridge类。你错了,你错过了_private成员。这个总是出错。如果不是立即,那么在一年后当你修改真正的Bridge类时。
接下来的事情是不可避免的。真正的类对象比编译器在编译重新声明的类时所认为的大。所以它没有在堆栈上预留足够的空间来存储对象。不可避免地,这将导致堆栈上的另一个变量被破坏,在实际类分配_private成员时被覆盖。
给微软买根雪茄,在这个诊断中构建,像这样的堆栈损坏通常非常难以诊断。并使用.h文件来声明Bridge.