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岁,这是什么?
答案 0 :(得分:3)
您正在按值传递cat
指针,因此您在函数内所做的任何更改都不会反映在外部。您需要通过引用传递指针,如int*& cat
。
答案 1 :(得分:1)
cat
not 被返回给此函数的调用者。您只是在执行cat = longcat
时更改本地副本。
这意味着您传入此函数的参数仍然指向您非常不方便删除的旧地址。
将其作为引用传入或者执行旧的C双指针技巧并传入其地址。
您可能还需要确保在第一次调用时,cat
具有有效值且size
和looong
兼容(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
变量仍然指向旧块。
你调用该函数的 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);