如何释放此数组

时间:2017-02-16 23:23:29

标签: c++ memory-management

这是我的简单程序,它有两个函数,一个是创建一系列Fibonacci然后将它添加到数组中。另一个用于释放数组,但它不起作用。有人能帮助我吗?

int **createFibArray(int n){

    int **arr = new int*[n];
    int fnum1 = 1,fnum2=1,fnum;

    //  n== 1
    if(n == 1){
        arr[0] = new int;
        *arr[0] = 1;
        return arr;
    }

    //  n>= 2
    arr[0] = new int;
    arr[1] = new int;
    *arr[0] = 1;
    *arr[1] = 1;

    // fib calculator
    for(int i=2; i<n; i++){
        fnum = fnum1 + fnum2;
        fnum1 = fnum2;
        fnum2 = fnum;

        arr[i] = new int;
        *arr[i] = fnum;
    }
    return arr;
}


//This function takes an array pointer, and deallocates memory
void removeArray(int head[]){
    delete [] head;
    head = nullptr;
}

int main(){

    int **head = createFibArray(10);
    for(int i=0;i<10;i++){
        cout << *head[i] << endl;
    }
    cout << "------" << endl;
    removeArray(*head);
       for(int i=0;i<10;i++){
        cout << *head[i] << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您需要强烈考虑返回整数数组而不是整数指针数组。如果你坚持使用原始指针而不是STL容器:

int **createFibArray(int n)

应该是

int *createFibArray(int n)

而且:

int **arr = new int*[n];

将是这样的:

int *arr = new int[n];

然后你几乎可以从你使用它的每个地方删除*,删除功能可以保持不变。您将调用更改为删除功能:

removeArray(*head);

变为:

removeArray(head);

但是,在函数中将值设置为nullptr是没有价值的。要么在调用removeArray之后这样做,要么完全省略它,如果你确定它在删除后永远不会被重复使用。

这将我们带到了main函数的最后一部分。删除指针后取消引用指针(或在此情况下尝试删除它)是未定义的行为。