Debugging C++ CLI/TS3客户端在插件上崩溃

Debugging C++ CLI/TS3客户端在插件上崩溃,debugging,plugins,crash,c++-cli,teamspeak,Debugging,Plugins,Crash,C++ Cli,Teamspeak,所以。。。 我已经写了一个插件,整个插件运行良好。 唯一的问题是: 我的TS3客户端崩溃了 要给出上下文: 警告:该代码粘贴不好。在GitHub上,它在第270和285行崩溃 // Helper Function String^ getChannelName(uint64 serverConnectionHandlerID, uint64 channelID) { char* tmp; if (ts3Functions.getChannelVariabl

所以。。。 我已经写了一个插件,整个插件运行良好。 唯一的问题是: 我的TS3客户端崩溃了

要给出上下文:

警告:该代码粘贴不好。在GitHub上,它在第270和285行崩溃

// Helper Function

    String^ getChannelName(uint64 serverConnectionHandlerID, uint64 channelID) {
        char* tmp;
        if (ts3Functions.getChannelVariableAsString(serverConnectionHandlerID, channelID, CHANNEL_NAME, &tmp) == ERROR_ok) {
            return marshal_as<String^>(tmp);
        }
        else
        {
            return "ERROR_GETTING_CHANNELNAME";
        }
    }
    void assemble_a() {
        List<String^>^ clients;
        List<String^>^ channel;

        // Some middlepart here, but I made sure it works as it should

        // And the actual part where it is crashing
        if (resChL == ERROR_ok) {
            for (int i = 0; channelListPtr[i]; ++i) {
                String^ a = getChannelName(schid, channelListPtr[i]);
                const char* b = (const char*)(Marshal::StringToHGlobalAnsi(a)).ToPointer();
                ts3Functions.logMessage(b, LogLevel_DEBUG, "DEBUG_VC", schid);
                if (String::IsNullOrEmpty(a) == false) {
                    channel->Add(a); // It crashes RIGHT at this point
                }
            }
        }
    }
所以我在TS3论坛上问了很长时间,得到了很多答案,没有人能告诉我为什么它会崩溃,我也没能自己弄明白

它实际上会打印通道名[*0]t,但一旦将其附加到字符串列表中,它就会崩溃。 它抛出线程试图从其没有访问权限的虚拟地址写入或读取的消息

我真的不知道该怎么办,现在已经试着修复了两个多星期了

全文如下:

对不起,如果这个问题可能有点离题,这里是吗?我不知道。。。但我真的不知道该怎么处理这个问题了

编辑: 来自try/catch的错误消息是:
System.NullReferenceException:Objectreference未设置为Objectinstance,发生在tsapi.assembleGrammar中

通道为空。您需要用一些东西来初始化它,可能是新列表。我不知道为什么您收到的是拒绝访问消息而不是NullReferenceException

其他问题 确保正确处理所有非托管字符串。例如,getChannelVariableAsString是否需要调用来显式释放缓冲区?一定要调用FreeHGlobal来释放StringToHGlobalAnsi分配给您的内存。
System.NullReferenceException:Objectreference未设置为Objectinstance,发生在tsapi.AssembleGrammarth中。我确保字符串正常。我使用的是marshal_as和StringToHGlobalAnsi。虽然字符串不好,但您只在调用StringToHGlobalAnsi的三个位置之一调用FreeHGlobal。这是内存泄漏。真的吗??嗯,我正在努力将StringToHGlobal更改为marshal_,使用marshal_转换为std::string或带有marshal_上下文的char*也可以解决内存泄漏问题。问题是,我找不到多个使用StringToHGlobalAnsi的情况,我在那里释放了它。那么我想那就好了?
List<String^>^ channel;
...
channel->Add(a);