我有一个整数数组,我传入函数。然后我想在该函数中创建一个动态数组作为第一个数组的副本,但每当我更改第二个数组(副本)中元素的值时,第一个数组中的值也会发生变化。我做错了什么?
示例:
int *array1 = new int[N]
int *array2 = new int[N]
array2 = array1;
array2[1]=2; //element of the first array at index 1 also becomes 2
谢谢。
答案 0 :(得分:4)
由于我们正在处理C ++,因此几乎没有理由使用new int[N]
而不是大小为std::vecotr<int>
的{{1}}。
解释代码中发生的事情:创建一个名为N
的指针,并分配足够的内存以包含array1
个整数。您使用名为N
的第二个指针执行相同的操作。由于名称array2
和array1
只是指向内存的指针,因此可以更改它们指向的内容。在行array2
中,您将更改为将array2 = array1
指向由array2
指针分配和指向的内存的内容。
那么现在发生了什么?真的很糟糕的东西。您遇到内存泄漏。 array1
指向的内存仍然存在,仍然已分配,但您无法访问它,因为您对它的唯一访问权限(array2
指针)现在指向到完全不同的记忆部分。您现在还有2个指向同一内存的指针(最初是在行array2
中分配的内存)。
使用int *array1 = new int[N]
。 Vector类带有编写良好且安全的赋值运算符,可在此处运行:
std::vector<int>
现在你有2个相同的向量,内存管理得很好(std::vector<int> array1(N);
std::vector<int> array2(N);
array2 = array1;
和array1
是独立的实体。它们不共享相同的内存,可以自由更改而不会影响另一个)和你的代码看起来很漂亮。
如果您无法将所有内容更改为array2
您提到了一个传递给函数的数组。我们称之为std::vector
,其大小为original_array
。请考虑使用类似签名的代码,但通过将数组转换为向量来使用安全的内存管理:
N
请记住添加void copy_and_do_stuff(int original_array[], int N)
{
std::vector<int> array2;
std::copy(original_array, original_array + N, array2.begin());
// here, the vector "array2" is a copy of your `original_array`. Changes
// to it will not affect your argument.
// ... do whatever you need to do in this function ...
}
和#include <vector>
以使用向量和#include <algorithm>
函数。
答案 1 :(得分:-1)
正如评论中所提到的,你可能不应该在c ++中这样做; std :: vector是优化的;处理此类数据的安全可靠的方法。
但是从你的问题中可以清楚地看出,你并没有真正理解指针。
这就是你的代码所做的:
int *array1 = new int[N]; //allocate memory for the first array
int *array2 = new int[N]; //allocate memory for the second array
array2 = array1; //OVERWRITE the location of the second array
//with that of the first (thus destroying your
//only pointer to the second array and creating a
//memory leak)
要在array2 = array1中实现您想要的效果,您需要编写一个循环并将数组的每个整数元素复制到新数组中 - 这会创建一个深层次的&#39;副本。
答案 2 :(得分:-2)
array1和2是你的情况下的指针。 当你这样做时:
array2 = array1;
array2指向与array1相同的内存位置,旧的array2在内存中丢失(因此它会产生内存泄漏,正如Elemental所说) 您需要手动复制数组元素或使用std :: vector