在C++中,有两种类型的存储:stack基于记忆,和heap基于记忆。基于堆栈的内存中对象的大小必须是静态的(即不改变),因此必须在编译时知道。这意味着你可以这样做:
int array[10]; // fine, size of array known to be 10 at compile time
但不是这个:
int size;
// set size at runtime
int array[size]; // error, what is the size of array?
请注意,a 之间存在差异constant价值和价值编译时已知,这意味着你甚至不能这样做:
int i;
// set i at runtime
const int size = i;
int array[size]; // error, size not known at compile time
如果你想要一个动态大小的对象,你可以使用某种形式的访问基于堆的内存new
操作员:
int size;
// set size at runtime
int* array = new int[size] // fine, size of array can be determined at runtime
然而,这种“原始”用法new
is 不建议因为你必须使用delete
恢复分配的内存。
delete[] array;
这是一个痛苦,因为你必须记住delete
你所创造的一切new
(并且仅delete
一次)。幸运的是,C++ 有许多数据结构可以为您执行此操作(即,它们使用new
and delete
在幕后动态改变对象的大小)。
std::vector
是这些自我管理数据结构的一个示例,并且是数组的直接替代品。这意味着你可以这样做:
int size;
// set size at runtime
std::vector<int> vec(size); // fine, size of vector can be set at runtime
不用担心new
or delete
。它变得更好,因为std::vector
will 自动地添加更多元素时会调整自身大小。
vec.push_back(0); // fine, std::vector will request more memory if needed
总之:不要使用数组,除非您在编译时知道大小(在这种情况下,不要使用new
),而是使用std::vector
.