【发布时间】:2012-06-27 18:28:05
【问题描述】:
我刚刚使用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。
什么给了?
【问题讨论】:
-
为什么不
std::string?你在delete cmdblip;中有未定义的行为。应该是delete [] cmdblip;。 -
@FredLarson - 试图在程序的这个特定部分远离 std::string。并感谢您的提示!
-
不要试图远离
std::string,尽量远离char*! -
不使用
std::string过于本地化。这段代码很糟糕,它出错的直接后果是您的代码非常糟糕,而不是任何特定的糟糕实例。 -
正如标记的答案所述,我有一个错字并且正在将一个指针传递给一个指针。更改后我的代码完美运行。对于特定的代码部分,我需要远离std::string。给你的飞机降温,孩子们。
标签: c++ access-violation strcmp arrays