假设我想创建一个数组,并希望构建数据并将其添加到函数中的数组中。该数组将在函数外部使用,我只想将创建组织成一个函数。是否最好为函数外部的数组分配内存,然后将指向该位置的指针传递给函数?或者使用new为函数内部的数组分配内存会更好,然后返回指向内存中位置的指针?或者我还有其他事情要做吗?
我认为第一个好处是我可以选择是在堆栈上还是在堆上分配内存,具体取决于我调用此函数的方式/原因。就像这个数组可能不需要在堆上一样,我只需要一个调用它的函数。我不必担心函数中的内存创建和删除,因为外部代码会处理它。第二个好处是我认为它更简单。
答案 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]; }
}