0

它将获得意想不到的价值:

double* myFunction()
{
    double a[2];
    a[0]=0.1;
    a[1]=0.2;
    return a;
}
int main()
{
    double* a = myFunction();
    cout<<a[0];  // it is not 0.1
    cout<<a[1];  // it is not 0.2
}

它将获得预期值:

double* myFunction()
    {
        double* a = new double[2];
        a[0]=0.1;
        a[1]=0.2;
        return a;
    }
    int main()
    {
        double* a = myFunction();
        cout<<a[0];  // it is 0.1
        cout<<a[1];  // it is 0.2
    }

这两种方法有什么区别?

为什么第一种方法不能正常工作?

4

3 回答 3

6

以您的第一种方式:

 double a[2];

是分配在堆栈上的本地数组,它的内存将在退出时被释放myFunction,所以double*将指向释放的内存,你看到了垃圾值。

double* a = new double[2];

它也是一个在堆上动态分配的本地数组,但是,它的内存在退出时不会被释放myFunction,返回double*时会指向该数组myFunction。您需要显式调用delete[] a以释放内存。

于 2013-04-22T03:13:36.930 回答
1

第一个在堆栈上分配它的数组,在函数调用后被杀死,第二个分配的内存没有被释放,但你以后必须自己释放它

于 2013-04-22T03:13:17.143 回答
0

第一种方法使用数组,当程序超出范围时,数组的范围会变成垃圾,因为它是在堆栈上分配的内存。但是,第二种方法使用堆分配,其中内存一直保留到delete []被调用。

如果您不使用非常大的数组,您也可以考虑使用std::vector,它结合了堆栈和堆分配,从某种意义上说,内存组件存储在堆上,当您超出范围时它们会被删除,而您不必调用delete[] 显式删除它占用的内存。

于 2013-04-22T05:02:13.290 回答