C++如何通过超出大小将元素添加到指针数组中
C++ how to add an element to a pointer array by exceeding size
假设我们创建了动态分配的内存,例如:
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 );
除了所有的内存管理都是由向量内部完成的。
第二个选项是正确的方法。第一个选项不会总是抱怨,但您正在写入尚未为数组留出的内存;它被留作其他用途,你不知道是什么。有时它会表现得很好,有时它不会。分配给超出其范围的数组是未定义的行为,我们应该避免它
在您的第一个示例建议中:
p[10] = 10;
p[11] = 11;
p[12] = 12;
您将覆盖您不拥有的内存,这可能导致崩溃。您需要重新分配原始阵列。
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
在内部管理分配,所以您不必担心new
和delete
。
相关文章:
- 添加到数组指针
- 使用指针将 ASCII 值添加到整数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 添加要映射的对象的唯一指针
- 向指针地址添加 20 个字节偏移量
- 是否允许向空指针添加零?
- 在对象向量中添加指针
- C++向结构添加指针
- 如何在对象的构造函数中添加(指针)到矢量
- 通过添加指针进行复制时可能出现缓存未命中
- 添加指针导致类错误,找不到重载的成员函数
- 如何使用 OutputDebugString 添加指针
- visual如何在C++中向类添加指针
- 添加指针的内容到BSTR
- 在c++中向向量添加对象vs向向量添加指针
- c++内存泄漏:在函数中添加指针,在函数外删除指针
- 向循环中的vector添加指针
- 如何在Java编程语言中添加指针
- 如何删除向量的多个添加指针