C++ 如何通过超出大小向指针数组添加元素

标签 c++ arrays pointers vector memory-management

假设我们创建了动态分配的内存,例如:

int SIZE = 10;
int *p = new int[SIZE];
for(int i = 0; i < SIZE; ++i)
  p[i] = i;

它将把 0 到 9 赋值给我们的指针数组。
然后我想将 10,11,12 添加到数组
我可以做什么:

p[10] = 10;
p[11] = 11;
p[12] = 12;

或者我应该这样做:

delete[] p;
size = 13;
p = new int[SIZE];
for(int i = 0; i < SIZE; ++i)
  p[i] = i;

最佳答案

您必须为更大尺寸的数组重新分配内存。否则程序将出现未定义的行为。

例如

int SIZE = 10;
int *p = new int[SIZE];
for(int i = 0; i < SIZE; ++i)
  p[i] = i;

int *tmp = new int[SIZE + 3];

std::copy( p, p + SIZE, tmp );
delete []p;
p = tmp;

p[SIZE++] = 10;
p[SIZE++] = 11;
p[SIZE++] = 12;

或者您可以编写代替最后三个语句

for ( const int &value : { 10, 11, 12 } ) p[SIZE++] = value;

当然,在这种情况下,最好使用标准容器 std::vector

实际上上面的代码类似于下面的

#include <vector>

//...

std::vector<int> v( 10 );

for ( int i = 0; i < v.size(); i++ ) v[i] = i;

v.reserve( 13 );
for ( const int &value : { 10, 11, 12 } ) v.push_back( value );

除了所有内存管理都是由 vector 内部完成的。

关于C++ 如何通过超出大小向指针数组添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916552/

相关文章:

c++ - 为什么 Malloc() 关心边界对齐?

c++ - 指针不会返回 char 类型的地址

c++ - 从结构中引用对象的指针

c++ - Xcode 中的 Flex、Bison、C++

c++ - 注入(inject) C++ DLL

ios - 如何在 Swift 中创建和访问 NSDictionary

c - 根据特定字符的出现分割字符串

c++ - 抽象线程相关的 STL 和 Boost 类型和方法

c++ - 如何标记(单词)将标点符号分类为空格

arrays - 如何为每个 CollectionView 部分拥有不同的数据集?