C++ 调整数组大小。为什么我不能再次调整数组的大小_CrtIsValidHeapPointer(PUserData)
我想多次调整数组的大小。它第一次这样做,但之后,它抛出了一个错误。当我第二次这样做时,我得到一个错误_CrtIsValidHeapPointer(PUserData)。有人能帮我吗C++ 调整数组大小。为什么我不能再次调整数组的大小_CrtIsValidHeapPointer(PUserData),c++,C++,我想多次调整数组的大小。它第一次这样做,但之后,它抛出了一个错误。当我第二次这样做时,我得到一个错误_CrtIsValidHeapPointer(PUserData)。有人能帮我吗 int main() { int size = 8; int *arr = new int[size]; arr[1] = 25; arr[2] = 30; int count = 0; //to check size for (int i = 0; i <
int main()
{
int size = 8;
int *arr = new int[size];
arr[1] = 25;
arr[2] = 30;
int count = 0; //to check size
for (int i = 0; i < size; i++)
{
count = count + 1;
}
cout << count << endl;
resize(arr, size);
int new_count = 0; //to confirm size change
for (int i = 0; i < size; i++)
{
new_count = new_count + 1;
}
cout << new_count << endl;
resize(arr, size);
int new_count2 = 0; //to confirm size change
for (int i = 0; i < size; i++)
{
new_count2 = new_count2 + 1;
}
cout << new_count2 << endl;
return 0;
}
void resize(int *a,int &size)
{
int newsize = 2 * size;
int *arr_new = new int[newsize];
for (int i = 0; i < size; i++) //copy everything
{
arr_new[i] = a[i];
}
size = newsize; //new value of size
delete [] a;
a = arr_new; //Pointer pointing to new array
delete arr_new;
}
intmain()
{
int size=8;
int*arr=新的int[size];
arr[1]=25;
arr[2]=30;
int count=0;//检查大小
对于(int i=0;i cout此代码有两个问题:
void resize(int *a,int &size)
{
[...]
delete [] a;
a = arr_new; //Pointer pointing to new array
delete arr_new; // huh????
}
第一个问题是您两次调用delete操作符;第一次调用删除旧数组(这是有意义的),但随后您也尝试删除新分配的数组(通过delete arr\u new
)。当resize()时,调用者将如何使用新分配的数组
在返回之前是否已将其删除
第二个问题是,您将a
设置为指向新数组(即a=arr\u new;
),但a
是一个局部函数参数,当resize()
返回时,该参数超出范围,因此调用代码将永远看不到它的新值。我认为您希望这样:
void resize(int * & a,int &size) // note the & before a!
通过引用传递a
将允许调用方在resize()
返回后查看a
的新值。通过引用传递size
,但通过值传递a
,即使参数正确,也将a
指向arr\u new
,然后立即删除arr\u new
(使用时不带[]
)-这会使`无效。删除arr\u new;
--错误的删除形式。
。这应该是删除[]arr\u new;
。其次,你为什么要删除刚刚分配的内存?谢谢你的帮助!我不明白这一点。当我执行a=arr\u new时,“a”现在不是指向分配的内存吗?我可以删除arr\u new,因为“a”也指向相同的内存,arr\u new不需要。我可能听起来很傻,但我不熟悉编码。而且,arr\u new是新的局部函数变量对吗?指针arr\u new
是一个堆栈变量,因此不需要删除它。要记住的规则是,每次调用new
,您应该准确地调用delete
——不能多,也不能少。arr\u new
确实是一个局部变量,因为您在中声明了它e> resize()!