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[] 做了一些坏动作。我在我的一篇代码审查帖子中了解到,每当我使用 new X[] 时,我都应该使用 delete[],所以我开始将它们放在BYTE temp[4]我可以替换的任何地方,BYTE* temp = new BYTE[4]并添加相应的 delete[]。起初看来,如果我使用 new X[] 它将将该数组中的所有值设置为零(结果是虚假的,因为它正在抛弃我的加密/解密方法)所以现在我正在尝试找出我的哪个删除删除太多...这让我想问另一个问题..

BYTE temp[4] = {0x00};有一种方法是不负责任的吗?new X[]还是使用and是更好的做法delete[]

4

1 回答 1

1

如果问题与堆损坏有关,您可以包括<crtdbg.h> 并打开每个 alloc/dealloc 的堆检查:

在应用程序开头的某个地方运行:

// _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);

如果问题与堆相关,您将得到一个断言(调试断言失败!表达式:_CrtCheckMemory())。此后,追溯程序执行并查找堆损坏的位置。

例如,如果您添加dest[0x10] = temp[0x03];到上面的代码并且dest在堆上分配,您将在 cout 上的 LogArray 中获得一个断言。

注意:设置 _CRTDBG_CHECK_ALWAYS_DF 可能会使您的应用程序运行缓慢。

于 2013-02-19T05:16:22.307 回答