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/请求一些帮助来解决我在代码中遇到的这个问题。显然,我的C++代码中的某个东西导致了堆损坏错误,而这个东西是delete[] cat。cat是用new运算符和指针创建的一个动态整数数组。为什么,那么当我使用数组delete时,整个程序决定在压路机下崩溃,并说我得到了堆损坏。我12岁了,这是什么?
发布于 2011-01-20 14:28:05
您是通过值传递cat指针的,因此您在函数内部所做的任何更改都不会在外部反映出来。你需要像int*& cat一样通过引用来传递指针。
发布于 2011-01-20 14:28:48
未将cat返回给此函数的调用方。只有在执行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变量仍然指向旧的块。
下一次调用该函数时,或者即使在其他地方取消了对ct的引用,也会陷入痛苦的世界,通常称为未定义行为。
通过将第一个参数设置为引用类型,在函数中所做的更改将反映在传入的变量中。
发布于 2011-01-20 14:41:19
你应该在函数args中用int* * cat删除int* cat,然后用* cat替换函数体中的所有cat插入,即使在cati位置也是如此。
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);https://stackoverflow.com/questions/4744083
复制相似问题