将 System::String 转换为 std::string 时 std::string 删除运算符中的运行时异常

Runtime exception in std::string delete operator when converting System::String to std::string

我正在使用 C++ cli 解决方案以及 C#C++ 代码。

当我尝试将 System::String 转换为 std::string 时,我在每个 运行:

上收到以下 运行time 异常
ucrtbased.dll!00007ffd9902b9b0()    Unknown
ucrtbased.dll!00007ffd9902eac5()    Unknown
MyApp.dll!operator delete(void * block) Line 21 C++
[Managed to Native Transition]  
MyApp.dll!std::_Deallocate(void* _Ptr, unsigned __int64 _Count, unsigned __int64 _Sz) Line 133  C++
MyApp.dll!std::allocator<char>::deallocate(char* _Ptr, unsigned __int64 _Count) Line 721    C++
MyApp.dll!std::_Wrap_alloc<std::allocator<char> >::deallocate(char* _Ptr, unsigned __int64 _Count) Line 988 C++
MyApp.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(bool _Built, unsigned __int64 _Newsize) Line 2260 C++
MyApp.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::=(std::basic_string<char,std::char_traits<char>,std::allocator<char> >& _Right) Line 934    C++
MyApp.dll!MyApp::DoStuff(System::String^ input) Line 59 C++

或者当我 运行 没有调试器时:

我的代码,我尝试了两个选项,都导致了同样的崩溃:

选项 1

void MyApp::DoStuff(System::String^ input) {
    msclr::interop::marshal_context context;
    std::string converted = context.marshal_as<const char*>(LicenseOEM);
}

选项 2

std::string SystemToStd(System::String^ sys) {
    int len = sys->Length;
    char* buff = (char*)malloc((len + 1) * sizeof(char));
    for (int i = 0; i < sys->Length; i++) {
        buff[i] = sys[i];
    }
    buff[len] = '[=15=]';
    std::string str = std::string(buff, len);
    free(buff);
    return str;
}

void MyApp::DoStuff(System::String^ input) {
    std::string converted = SystemToStd(LicenseOEM);
}

也许这本身就是一个 C++ 主题。

您是否确保为您的配置绑定 right/fitting/same 运行时 dll。

Microsoft 的调试 dll(其他我不知道的)试图查明是否有人破坏了内存。 他们通过提供 new/delete 的不同实现来做到这一点。 基本上他们扩大了分配的内存,在你分配的内存之前和之后都有未使用的内存。然后他们用模式和信息填充它,并为您提供指向您的对象的指针。当delete/freeing对象时,他们为你的内存区域获取正确的值并控制信息,如果有人覆盖了你对象前后的模式。

所以你尝试绑定一个用release编译的dll作为配置。 但是现在您尝试找出一些东西,使用调试,现在忘记了您的运行时 dll 不匹配 然后您的代码正在使用调试信息创建它,但是 您将此对象提供给 native/cpp 函数,该函数是使用 release 编译的,并尝试释放该对象,但该对象不起作用。反之亦然,释放 std:string 是通过调试删除释放的。

实际上我用谷歌搜索了你的失败信息和一些相同方向的提示,所以你可以重新检查