【问题标题】:Benefit of using pointers for dynamic memory allocation with arrays使用指针对数组进行动态内存分配的好处
【发布时间】:2012-10-11 16:17:52
【问题描述】:

我正在尝试了解使用此功能的好处...

double *x = new double[n];

而不仅仅是使用这个...

double x[n];

谢谢

#include <iostream>

using namespace std;

main()
{
    int n;
    cout<<"# of elements in array"<<endl;
    cin>>n;

    double *x = new double[n]; //or double x[n]

    int i;

    for(i=0;i<n;i++)
    {
        cout<<x[i]<<endl;
    }
    return 0;
}

【问题讨论】:

标签: c++ arrays memory pointers


【解决方案1】:

强制说明:

std::vector<double> x(n);

胜过你所拥有的。

实际答案:

好处是

double *x = new double[n];

是合法的,而

double x[n];

不是,除非n 是编译时常量(在您的情况下,它不是)。

C++ 不支持变长数组。

【讨论】:

  • 在这种情况下,合法的东西意味着什么?两种方法都有效。我想了解的是为什么我会使用指针?
  • @Rambi:第二个不适用于大多数 C++ 编译器。您可能正在使用 g++ 。
【解决方案2】:

动态分配可以让你做很多事情。

  • 首先,您可以从创建它的函数中返回这个数组。

  • 严格 C(C89) 不允许动态堆栈分配。 double x[n] 会在许多编译器上抛出错误。

【讨论】:

  • “严格 C 不允许动态堆栈分配”不正确。 C99 添加了variable length arrays
  • 我相信 Tom 的意思是 C89 «Strict C»。更不用说这篇文章是关于 C++ 的了,很明显。而且 VLA 的定义真的很差,这是在程序中获得自毁行为的最简单方法之一。
【解决方案3】:

如果数组太大,动态分配的数组不会导致Stack Overflow

指针在栈上,但内容在堆上。然而,缺点包括由于间接导致的访问速度较慢、可能的内存泄漏和更难以理解的代码。

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多