交换对象数组是不是会影响指向它的指针
Posted
技术标签:
【中文标题】交换对象数组是不是会影响指向它的指针【英文标题】:Does the swapping an array of object around affects the pointers that pointing at it交换对象数组是否会影响指向它的指针 【发布时间】:2021-07-08 07:03:13 【问题描述】:在交换或移动对象数组时,如果假设数组中有指向随机对象的指针会发生什么。指针是否在对象元素移动时跟随它们?如果他们不这样做,有没有办法让他们这样做?
【问题讨论】:
不。他们没有 什么样的数组?常规的?用new
创建的那个? std::array
? std::vector
?
指针指向内存中的地址。如果对象从该地址移动,则指针不再指向它。结束!如果您希望引用/指针/迭代器的稳定性同时还能够任意分类元素,则需要通过智能指针进行分配,对索引/指针的向量而不是对象本身进行排序,或者使用在此类操作之间保持稳定性的容器。这方面会有很多信息。
@underscore_d 我不同意。对象不能在内存中移动。
@DanielLangr Pedantry 只有伴随着细化才有用......
【参考方案1】:
对象不要移动。对象中保存的值可以移动(或交换或复制)到不同的对象中。
指针指向对象。如果这些对象的值发生更改,则指针指向更改后的值。如果对象的生命周期结束,则指针悬空。
【讨论】:
【参考方案2】:当交换或移动对象数组时,如果假设数组中有指向随机对象的指针会发生什么。指针是否跟随对象元素移动?
指针将指向与以前相同的内存地址。如果更改数组中的值,则不会影响指针。
如果他们不这样做,有没有办法让他们这样做?
是的,有一种方法,您只需让它们指向您希望它们指向的任何位置。
例子:
int array[] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
int *ptr = &array[5]; // pointing to array[5]
printf("%d\n", *ptr); // prints 6
array[5] = 20; // changing the value if array[5]
printf("%d\n", *ptr); // still pointing to array[5], prints 20
ptr = &array[2]; // now pointing to array[2]
printf("%d\n", *ptr); // prints 3
当然,这必须应用于您所说的交换方法,您没有显示任何代码,因此我无法举例说明。
【讨论】:
【参考方案3】:当对象在数组中移动时,有一些方法可以让指针跟随对象。最简单的方法是在对象在数组中移动时简单地修改指针。
T arr[5];
T* ptr = &arr[3]; //point to the third element
std::swap(arr[1], arr[3]); //swap array element 1 with 3
ptr = &arr[1]; //update the pointer to point to element 1
我认为您要求的是移动/交换对象而不修改指针以指向对象的新位置。最简单的方法,也是您看到最多的方法,是在堆上分配一个指向对象的指针数组(这里使用std::shared_ptr
实现)。
std::shared_ptr<T> arr[5]; //array of 5 shared_ptr<T>
arr[0] = new T();
arr[1] = new T();
arr[2] = new T();
arr[3] = new T();
arr[4] = new T();
T* ptr = &*arr[3]; //point to the third element
std::swap(arr[1], arr[3]); //swap array element 1 with 3
//no need to update the pointer
这是因为shared_ptr
在堆上分配T
(听到new operator
所示),所以交换arr[1]
和arr[3]
意味着ptr
仍然指向同一个T
。
注意代码未编译或测试。
请注意,这适用于任何可修改的连续或非连续数据存储,例如 std::vector<T>
,而不是数组。
【讨论】:
std::optional
does not allocate on the heap: "如果optional<T>
包含一个值,则保证该值作为可选对象占用空间的一部分进行分配,即不会占用动态内存分配” 您可以使用 共享指针 来实现,但 唯一指针 可能更适合这里,因为它们的开销较低。以上是关于交换对象数组是不是会影响指向它的指针的主要内容,如果未能解决你的问题,请参考以下文章