在c++中删除类实例时出错

本文关键字:实例 出错 删除 c++ | 更新日期: 2023-09-27 17:51:14

我有下面的c++代码:

someclass* my = new someclass();
my->doSomething();
delete my;

当我从另一个c++项目中调用这个类时,它正好工作得很好。

但是当我在c#中调用它时,它会给我一个错误,我无法跟踪这个错误。

这是我如何从c#中调用c++ dll。

[DllImport(@"Helper.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string LoginQuery(string UserID, string UserPW, string ProxyServer, StringBuilder Cookies);

这是c++代码。

extern "C" FUNCDLL_API BSTR LoginQuery(const char* UserID, const char* UserPW, const char* ProxyServer, char Cookies[])
{
    someclass* my = new someclass();
    std::string ret    my->doSomething();
    delete my;  --> here, I get error when called from C#.
    return ::SysAllocString(CComBSTR(ret.c_str()).Detach());
}
谁能解释一下原因?

编辑LoginQuery从类返回一些结果。

编辑我改了代码。

编辑错误消息如下所示。从韩语翻译成英语。

附加信息:运行时发生严重错误。错误地址是0x6799bd26(线程0x2860)。错误码为0xc0000005。此错误可能是不安全或CLR的一部分,也可能是用户代码中未经确认的一部分。通常这个错误的原因是com互操作或封送错误,它可以破坏堆栈。

如果有处理此异常的处理程序,则可以安全地继续执行程序。

在c++中删除类实例时出错

您需要在将my赋值为null之前删除它。

另外,看起来你返回的是std::string,而返回类型是BSTR。

另外,尝试将您的文件输入行更改为:

[DllImport(@"Helper.dll", EntryPoint="LoginQuery", CharSet = CharSet. dll]Unicode, CallingConvention = CallingConvention. cdecl]