【发布时间】:2013-02-19 13:25:08
【问题描述】:
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[] 和delete[] 更好?
【问题讨论】:
-
内存在删除时已经损坏。你应该在不同的地方寻找问题。
-
是的...试图找到那是我肉体上的一根刺。这可以解释为什么它是随机的......有时是这个功能,有时是其他功能......而且从来没有在同一个地方......这真的让我发疯......
-
ByteUtil::LogArray 有可能这样做吗?你能告诉我们它的代码吗?
-
我会在一秒钟内展示它..我承认它似乎在其他地方......我无法弄清楚..我真的需要花一些时间在指针上并更好地学习它们,但不幸的是,这个特定的项目是按时完成的。 :/ 这段代码并不总是罪魁祸首..似乎在任何有 delete[] 方法的地方。呃..
-
@Robert Snyder BYTE temp[4] = {0x00} 没问题。更好的做法可能是使用 std::vector 或 std::array。
标签: visual-c++ access-violation