0
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[]ですか?

4

1 に答える 1

1

問題がヒープの破損に関連している場合は、<crtdbg.h> すべての割り当て/割り当て解除にヒープチェックを含めてオンにすることができます。

アプリの最初のどこかで実行します。

// _CRTDBG_ALLOC_MEM_DF -- Turn on debug allocation
// _CRTDBG_CHECK_ALWAYS_DF -- check the heap's integrity at every allocation and deallocation.
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);

問題がヒープに関連している場合は、アサーションを取得します(Debug Assertion Failed!式:_CrtCheckMemory())。この時点の後、プログラムの実行をさかのぼって、ヒープが破損している場所を探します。

dest[0x10] = temp[0x03];たとえば、上記のコードに追加し、 destがヒープに割り当てられた場合、coutのLogArray内でアサーションを取得します。

注: _CRTDBG_CHECK_ALWAYS_DFを設定すると、アプリの実行が遅くなる可能性があります。

于 2013-02-19T05:16:22.307 に答える