堆腐败?在我的动态记忆?

时间:2011-01-20 06:23:36

标签: c++ heap-corruption

void longcatislong(int* cat, int &size, int &looong)
{
    int* longcat = new int[looong*2];
    for(int i = 0; i < size; i = i + 1)
        longcat[i] = cat[i];
    delete [] cat;
    cat = longcat;
    looong = looong * 2;
}

汤家伙。我正在使用我的代码解决这个问题的一些帮助。显然,我的C ++代码中的某些内容导致了堆损坏错误,并且某些内容为delete[] cat。 cat是使用new运算符和指针创建的动态int数组。那么,为什么当我使用数组删除时,整个程序决定在压缩机下被粉碎,并说我有堆腐败。我12岁,这是什么?

3 个答案:

答案 0 :(得分:3)

您正在按值传递cat指针,因此您在函数内所做的任何更改都不会反映在外部。您需要通过引用传递指针,如int*& cat

答案 1 :(得分:1)

cat not 被返回给此函数的调用者。您只是在执行cat = longcat时更改本地副本。

这意味着您传入此函数的参数仍然指向您非常不方便删除的旧地址。

将其作为引用传入或者执行旧的C双指针技巧并传入其地址。

您可能还需要确保在第一次调用时,cat具有有效值且sizelooong兼容(looong * 2 >= size),以免您腐败的记忆。

请查看以下代码,说明您的问题:

#include <iostream>
void longcatislong1(int* cat, int &size, int &looong)
{
    int* longcat = new int[looong*2];
    for(int i = 0; i < size; i = i + 1)
        longcat[i] = cat[i];
    delete [] cat;
    cat = longcat;
    looong = looong * 2;
}

void longcatislong2(int*& cat, int &size, int &looong)
{
    int* longcat = new int[looong*2];
    for(int i = 0; i < size; i = i + 1)
        longcat[i] = cat[i];
    delete [] cat;
    cat = longcat;
    looong = looong * 2;
}

int main (void) {
    int sz = 0;
    int lng = 10;
    int *ct = 0;
    std::cout << ct << std::endl;
    longcatislong1 (ct, sz, lng);
    std::cout << ct << std::endl;
    longcatislong2 (ct, sz, lng);
    std::cout << ct << std::endl;
    return 0;
}

它的输出是:

0
0
0x9c83060

表示longcatislong1调用未在返回时成功设置ctlongcatislong2函数将指针作为参考传递, 正确设置ct


因此,假设您有一个指向0xf0000000的有效指针。当您调用原始函数时,将分配一个新的内存块,复制数据并删除旧块。

但是ct变量仍然指向旧块。

你调用该函数的 next 时间,或者即使你在其他地方取消引用ct,你也会陷入痛苦的世界,通常被称为未定义的行为。

通过使第一个参数成为引用类型,函数中所做的更改将反映在传入的变量中。

答案 2 :(得分:0)

你应该在函数args中删除int ** cat中的int * cat,然后替换所有cat插入 在函数体中由*猫甚至在cat [i]放置。

void longcatislong(int** cat, int &size, int &looong)
{
    int* longcat = new int[looong*2];
    for(int i = 0; i < size; i = i + 1)
        longcat[i] = *cat[i];
    delete [] *cat;
    *cat = longcat;
    looong = looong * 2;
}

然后当你调用函数调用它时:

longcatislong(&cat, size, looong);