将std :: string从c ++ / cli dll传递给本机win32 dll时,调试断言失败错误

时间:2013-03-20 13:14:04

标签: c++-cli

我有一个C#表单调用c ++ / cli接口DLL,它调用win32本机c ++ dll。最初这是用VS2010编写的,并且正在工作 - 我能够将System :: String编组为std :: string,将其传递给本机dll,然后输出值。然后我将C#和c ++ / cli项目转换为VS2012以启用智能感知。这需要一个Service Pack安装来重新启用VS2010中的4.0 .NET框架。我在2010年重建了Win32 dll,在VS2012中重建了C#app和c ++ / cli dll,现在我在调用dll时遇到错误:

Debug Assertion失败!

程序: ... 文件:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c 行:1424

表达式:_pFirstBlock == pHead

public ref class ManagedWrapper
{
    CSampleWin32Library* m_pUnmanagedWrapper;


public:
    ManagedWrapper() {m_pUnmanagedWrapper = new CSampleWin32Library();}
    ~ManagedWrapper() {delete m_pUnmanagedWrapper;}

    //Test call to prove integration
    void Test(int x, System::String^ testString) {
        //marshaling example: http://msdn.microsoft.com/en-us/library/bb384865.aspx         
        std::string tmpStdString = marshal_as<std::string>(testString);
        m_pGambitUnmanagedWrapper->Test(x, tmpStdString); //ERROR OCCURS HERE
    };      
};

希望这与丢失的某些设置一样简单,或者现在在VS2012中需要。据我所知,我没有更改任何代码。

1 个答案:

答案 0 :(得分:1)

这个错误主要是因为在堆B中释放了你在堆A中的malloc的内存块。

您应该查看 Windows Via C / C ++ - 第IV部分动态链接库。

应用程序将在CRT运行时调用它。

有两种方法可以调用CRT - 链接到DLL C / C ++运行时库或链接到静态C / C ++运行时库以及不同版本的CRT。

所有这些都使用不同的内存管理。

因此,当您释放内存并将代码链接到DLL时,应该小心。