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[]でいくつか悪い動きをしたと思います。BYTE temp[4]
コードレビューの投稿の1つで、新しいX[]を使用するときは常にdelete[]を使用する必要があることを学びました。そのため、置き換えてBYTE* temp = new BYTE[4]
対応するdelete[]を追加するようなものをどこにでも配置し始めました。最初は、新しいX []を使用すると、その配列のすべての値がゼロに設定されるように見えました(暗号化/復号化メソッドを破棄していたため、偽物であることが判明しました)。削除したもののどれが削除しすぎているのかを把握してください...別の質問をしたくなります。
メソッドに含めるのは無責任BYTE temp[4] = {0x00};
ですか?new X[]
またはを使用する方が良い習慣delete[]
ですか?