“.exe”触发了一个断点

时间:2018-05-07 13:06:35

标签: c++ memory-management malloc

我继承了完全以32位运行的代码,但是当我将编译器更改为64位时,如果运行代码,则会出错。如果我执行代码,它(几乎总是)只是稍后失败。代码中有很多指针,C ++不是我强大的套件。是否有人可以了解错误发生的原因?

我需要了解的是:首先创建BYTE ***,然后是BYTE **, 和 BYTE *永远不会被分配给。我不明白这是如何工作的。我认为BYTE *会被分配到第一个,然后是BYTE **,然后是BYTE ***。为什么这适用于x86,而不适用于x64?

void* AllocMemory(SIZE_T dwBYTEs)
{
    void* result;
    if (dwBYTEs > 0)
    {
        result = malloc(dwBYTEs);
        if (result != NULL)
            return result;
    }
    return 0;
}

BYTE** CreateBytes(int arg_0, int arg_4, int arg_8)
{
    BYTE** hedi = (BYTE**)AllocMemory(arg_0 * 4);
    if (!hedi)return 0;
    hedi[0] = (BYTE*)AllocMemory(arg_0 * arg_8 * arg_4);
    if (!hedi[0]) {
        delete(hedi);
        return 0;
    }
    for (int i = arg_0 - 1; i > 0; i--) {
        hedi[arg_0 - 1 - i + 1] = &hedi[0][arg_4 * arg_8 * (arg_0 - 1 - i + 1)];
    }
    return hedi;
}

BYTE*** CreateItem(int arg_0, int arg_4, int arg_8)
{
    BYTE*** hebp = (BYTE***)AllocMemory(arg_8 * 4);
    hebp[0] = (BYTE**)CreateBytes(arg_0, arg_4 * arg_8, 1);
    if (!hebp[0])
    {
        delete(hebp);
        return 0;
    }
    for (int i = 1; i < arg_8; i++) {
        hebp[i] = (BYTE**)AllocMemory(arg_0 * 4);
        if (hebp[i]) {
            for (int j = 0; j < arg_0; j++) {//eax
                hebp[i][j] = &hebp[0][j][i];
            }
        }
        else {
            for (int j = i - 1; j > 0; j--) {//esi
                delete(hebp[j - i]);
            }
            delete(hebp[0]);
            delete(hebp);
            return 0;
        }
    }
    return hebp;
}

1 个答案:

答案 0 :(得分:5)

这是您的问题:AllocMemory(arg_0 * 4)

在32位系统上,指针的大小是32位,即4个字节。在64位系统上,指针是64位, 8 字节。使用正确的大小(使用sizeof运算符),它应该可以正常工作。

例如,在CreateBytes函数中

BYTE** hedi = (BYTE**)AllocMemory(arg_0 * 4);

将其替换为

BYTE** hedi = (BYTE**)AllocMemory(arg_0 * sizeof *hedi);

还有许多其他问题,例如使用malloc分配内存并使用delete释放内存的代码。这会导致未定义的行为

我甚至没有提到变量的命名或缺少评论......