gre*_*ghz 2 c++ arrays pointers
我正在考虑如何在C++中快速扩大阵列,我想出了这个:
// set up arr1
int *arr1 = new int[5];
// add data to arr1
arr1[0] = 1;
arr1[1] = 2;
arr1[2] = 3;
arr1[3] = 4;
arr1[4] = 5;
// set up arr2
int *arr2 = new int[10];
arr2 = arr1; // assign arr1 to arr2
// add more values
arr2[5] = 6;
arr2[6] = 7;
arr2[7] = 8;
arr2[8] = 9;
arr2[9] = 10;
Run Code Online (Sandbox Code Playgroud)
这甚至安全吗?我担心这会导致一些奇怪的行为,并且arr2只是一个int [5]数组,你现在正在覆盖不属于它的数据.
没有.
arr2 = arr1;
不做你认为它做的!
STL已经有了一些东西,它被称为vector.
为了完整起见.. :)
arr2在分配之前,如果您分配的10个项目的数组的开始,则保留地址.在赋值之后,不是复制内容所解决的块arr1(我猜你想做的事情),该赋值只是改变了arr2保存地址的地址arr1(即5项数组的开始),其余的代码,这有两个后果:
arr2,但是通过分配,您现在正在处理一个只有5个项目的块,并且访问5个块之外的任何内容(即索引5个以上)可能会以支持访问的鼻守护进程结束用一个非常大的板球棒 - 或者你可能会幸运...所以,你可以做什么:
std::vector<int>,一个,如果它的设计特点是从你那里承担这种负担(除非你有兴趣实施另一个容器),如果是这样的话std::copy- 或其他,例如memcpy(更喜欢memmove- 它有点慢但是为重叠块等定义好)该行arr2 = arr1;泄漏内存,并且所有以下arr2[...]=行在访问其边界之外的5个int的数组时调用未定义的行为.
要做你想做的事,替换arr2 = arr1;为std::copy(arr1, arr1+5, arr2); (示例程序:https://ideone.com/3Rohu)
要正确执行此操作,请使用 std::vector<int>
这会泄漏内存,因为您正在分配指针.
int *arr2 = new int[10];
arr2 = arr1; // this does not assign the values
Run Code Online (Sandbox Code Playgroud)
第二个赋值arr2指向数组arr1.您丢失了之前分配的阵列,并且永远不能删除它.
为避免这种情况,请使用std::vector.