C++ 调整数组大小。为什么我不能再次调整数组的大小_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 <

我想多次调整数组的大小。它第一次这样做,但之后,它抛出了一个错误。当我第二次这样做时,我得到一个错误_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 < 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;icout此代码有两个问题:

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()!