2011-01-20 81 views
0
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; 
} 

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

+6

-1请保持4chan的上4chan的。 (如果你要尝试,至少不要成为新的......) – GManNickG 2011-01-20 06:28:21

+0

难道你不知道规则1和2吗? – 2011-01-20 07:07:25

+0

这基本上是使用C++的规则 - 每一行都是压路机。 – ActiveTrayPrntrTagDataStrDrvr 2012-06-21 15:06:09

回答

3

您按值传递cat指针,所以无论您在函数内部做了哪些更改都不会反映到外部。您需要通过引用传递指针,如int*& cat

1

cat不是被返回给此函数的调用者。当您执行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呼叫没有成功设置ct上的回报。 longcatislong2功能,它将指针作为参考,确实设置ct正确。


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

ct变量仍然指向旧块。

下一个当你调用该函数,或者即使你在其他地方解除ct,你在一个痛苦的世界,通常被称为未定义的行为。

通过将第一个参数引用类型,在功能上作出变化反映早在中传递变量。

0

您应该删除INT *通过INT猫**猫函数参数,然后即使在cat [i]的位置上,也可以通过* cat替换功能体中的所有猫插入 。

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