c++ CLI无法删除传递给dll的指针

本文关键字:dll 指针 CLI 删除 c++ | 更新日期: 2023-09-27 17:54:00

我正在编写一个c# (c++ cli)包装器从dll(用c++编写)获取数据。我将CStringArray *传递给dll中的一个函数,该函数填充了字符串数组返回给我。我能读懂里面的内容。但是,当我试图删除由我创建的指针(我做一个新的,并传递该指针到dll函数),我得到访问违规异常。在SO中讨论了多个线程之后,我觉得这可能是由于dll和我的包装器的版本差异而发生的。dll是使用VS 2012构建的,我正在编写的包装器是在VS 2010中开发的。这有问题吗?我与dll的开发人员进行了交谈,他确认他只是添加了一些字符串,而没有在dll中进行任何分配。我写了一个测试代码(一切都是vs2010),其中我创建了一个dll,一个包装器和测试应用程序。我可以毫无问题地调用delete。请您的专家确认这是否是问题的真正根本原因。下面是代码片段(我的测试代码)。生产代码几乎相同,但在我调用RemoveAll()时崩溃。

    void MyDllWrapper::getLabels()
{
    CStringArray* data = new CStringArray;
    //FYI - mClass = new MyClass()
    mClass->getLabels(data); //Call dll to get the data 
    this->m_strLabels = gcnew List<String^>;
    for(int i = 0; i < data->GetCount(); i++)
    {
        Console::WriteLine("Added string {0}", gcnew String(data->GetAt(i)));
        m_strLabels->Add(gcnew String(data->GetAt(i)));
    }
    data->RemoveAll(); //works fine
    delete data;
}

c++ CLI无法删除传递给dll的指针

在MFC中没有ABI支持,除了MFC扩展dll及其消费者在相同的MFC版本和配置中构建(Unicode/MBCS, Debug/Release等)。混合MFC版本肯定行不通。

传递字符串数组的更好方法是使用C风格的接口,如VT_BSTR|VT_ARRAY类型的变体或包含双空终止字符串的字符串缓冲区。