何时在C ++中为数组分配内存?

时间:2016-06-30 14:56:41

标签: c++

假设我想创建一个数组,并希望构建数据并将其添加到函数中的数组中。该数组将在函数外部使用,我只想将创建组织成一个函数。是否最好为函数外部的数组分配内存,然后将指向该位置的指针传递给函数?或者使用new为函数内部的数组分配内存会更好,然后返回指向内存中位置的指针?或者我还有其他事情要做吗?

我认为第一个好处是我可以选择是在堆栈上还是在堆上分配内存,具体取决于我调用此函数的方式/原因。就像这个数组可能不需要在堆上一样,我只需要一个调用它的函数。我不必担心函数中的内存创建和删除,因为外部代码会处理它。第二个好处是我认为它更简单。

2 个答案:

答案 0 :(得分:9)

只需使用std::vector即可。这种事情就是它的用武之地。

答案 1 :(得分:0)

这一切都取决于你想做什么。当然,堆栈的分配速度要快得多,但这是否重要取决于上下文。

如果要封装此数组发生的事情,第三个选项是将其包含在对象中并在构造函数中运行初始化。这种方式而不是在初始化中隐藏分配,你将隐藏分配中的初始化:每次创建这种类型的数组时,它总是以这种方式初始化。

动态内存示例:

class MyArray {
    std::unique_ptr<int[]> array;
  public:
    MyArray(int n) : array(new int[n]) {
        /* initialization here */
    }
    int& operator [](int i) { return array[i]; }
}

当然,你必须将它作为自己的类MyArray传递而不是指针(但你应该传递指针),你必须实现方法从对象外部访问数组,如operator []

即使你封装了它,也请使用智能指针:虽然vector仍然有一些开销,unique_ptr和普通指针一样快,但确保动态内存将被释放只要MyArray超出范围,就无需在每条可能的路径上放置delete

或者如果您在编译时知道他们需要多长时间,您可以将它们放在堆栈上

 template<int len>
 class MyArray {
    int array[len];
  public:
    MyArray(int n) {
        /* initialization here */
    }
    int& operator [](int i) { return array[i]; }
}