static void InvShiftRows(BYTE* dest)
{
tcout << "\t\t\tInvShiftRows()+" << EOL;
BYTE* temp = new BYTE[16];
ByteUtil::LogArray("temp1", temp, 16);
memcpy(temp, dest, 16);
ByteUtil::LogArray("temp2", temp, 16);
dest[0x01] = temp[0x0D];
dest[0x02] = temp[0x0A];
dest[0x03] = temp[0x07];
dest[0x05] = temp[0x01];
dest[0x06] = temp[0x0E];
dest[0x07] = temp[0x0B];
dest[0x09] = temp[0x05];
dest[0x0A] = temp[0x02];
dest[0x0B] = temp[0x0F];
dest[0x0D] = temp[0x09];
dest[0x0E] = temp[0x06];
dest[0x0F] = temp[0x03];
ByteUtil::LogArray("Dest1", dest, 16);
delete[] temp;
tcout << "\t\t\tInvShiftRows()-" << EOL;
}
所以我追查到访问冲突偶尔会发生在delete[] temp
我的生活中,我无法弄清楚为什么。它只是随机执行。关于为什么的任何线索?
编辑 每个请求以查看 ByteUtil::LogArray
void ByteUtil::LogArray(char* header, const BYTE* thearray, int length)
{
tcout << header << "(" << length << ")-";
char* number = new char[4];
for(int i=0; i<length; i++)
{
sprintf_s(number, 4,"%02X:", thearray[i]);
wcout << number;
}
delete[] number;
wcout << EOL; //EOL is just std::endl << std::flush
}
老实说,我认为我用 delete[] 做了一些坏动作。我在我的一篇代码审查帖子中了解到,每当我使用 new X[] 时,我都应该使用 delete[],所以我开始将它们放在BYTE temp[4]
我可以替换的任何地方,BYTE* temp = new BYTE[4]
并添加相应的 delete[]。起初看来,如果我使用 new X[] 它将将该数组中的所有值设置为零(结果是虚假的,因为它正在抛弃我的加密/解密方法)所以现在我正在尝试找出我的哪个删除删除太多...这让我想问另一个问题..
BYTE temp[4] = {0x00};
有一种方法是不负责任的吗?new X[]
还是使用and是更好的做法delete[]
?