0

刚刚使用创建的 char 数组出现访问冲突new

DispatchCommand(char* cmdStr)
        {
            // Dispatch
            for(int i = 0; i < sizeof(_lpCommands); i++)
            {
                const int len = strlen(_lpCommands[i].szCommand);
                char* cmdblip = new char[len + 1];
                memcpy(&cmdblip, cmdStr, len);
                cmdblip[len] = '\0';  // Access Violation

                if(strcmp(cmdblip, _lpCommands[i].szCommand) == 0)
                {
                    if(strlen(cmdStr) > strlen(_lpCommands[i].szCommand))
                        (*_lpCommands[i].cbCallback)(&cmdStr[strlen(_lpCommands[i].szCommand)]);
                    else
                        (*_lpCommands[i].cbCallback)("");

                    delete cmdblip;
                    return;
                }

                delete cmdblip;
            }

            // Error and return
            *Out::ServerInfo<<"Command not found!"<<ENDL;
        }

_lpCommands 是一个Command结构数组:

struct Command
{
    char* szCommand;
    CommandCallback cbCallback;
};

产生的错误信息是:

Program.exe 中 0x012219cf 处的未处理异常:0xC0000005:访问冲突写入位置 0x66647366。

这是对memcmp使用memcpy.

是什么赋予了?

4

2 回答 2

6

不要&cmdblip传给memcpy. 您应该传递一个指向目标缓冲区的指针,而不是指向该指针的指针。cmdblip而是通过。

编辑:我同意一般来说,std::string 应该在 C++ 中使用。尽管如此,该代码崩溃的技术原因是memcpy破坏了cmdblip指针,使其指向实际上由复制字符串的前 4 个字节组成的内存位置。然后,cmdblip[len]导致内存位置不在分配的缓冲区(或任何其他合法分配的缓冲区)内,因此崩溃。因此,如果您想编写更好的代码,请使用 C++ 类。如果您想了解给定代码崩溃的原因,请考虑以上内容。

于 2012-06-27T18:31:28.430 回答
5

这个问题唯一可能有用的答案是“使用std::string”。每次您修改此函数或编写另一个类似的函数时,您现在遇到的特定问题只会再次出现或相同的问题。在一般情况下解决问题的唯一方法是转向基于类的解决方案,这是作为标准为您提供的。例如,您当前的代码是异常不安全的,除了给您带来访问冲突的任何内容之外,更不用说它不可读并且会出现许多其他错误,例如一对一,不正确的 NULL 终止,双删除和内存泄漏。哦,还有 UB,因为你delete就是你new[]

于 2012-06-27T18:39:55.193 回答