繁体   English   中英

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

[英]C++ how to add an element to a pointer array by exceeding size

假设我们创建了动态分配的 memory 如:

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;

您必须为更大的数组重新分配 memory。 否则程序将有未定义的行为。

例如

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 );

除了所有的 memory 管理都是由向量内部完成的。

第二个选项是正确的方法。 第一个选项不会总是抱怨,但您正在写入尚未为您的阵列预留的 memory; 它已被留作其他用途,而您不知道是什么。 有时它会表现得很好,有时它不会。 分配给超出其范围的数组是未定义的行为,我们应该避免它。

在您的第一个示例建议中:

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

您将覆盖您不拥有的 memory,这可能导致崩溃。 您需要重新分配原始数组。

const int oldSize = SIZE;
SIZE = 13;
int *newP = new int[SIZE];
memcpy(newP, p, oldSize * sizeof(int));
for (int i = oldSize; i < SIZE; ++i)
{
    newP[i] = i;
}

delete[] p;
p = newP;

您的第二个示例可以工作,但效率略低,因为您正在重新计算每次重新分配的值。 在我上面的示例中,您只需重新计算新值。

或者,您应该查看专门为此目的设计的std::vector (动态调整大小的数组)。

std::vector<int> p;
for (int i = 0; i < 10; ++i)
{
    p.push_back(i);
}

这里std::vector在内部管理分配,因此您不必担心newdelete

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM