交换对象数组是不是会影响指向它的指针

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&lt;T&gt;,而不是数组。

【讨论】:

std::optional does not allocate on the heap: "如果optional&lt;T&gt; 包含一个值,则保证该值作为可选对象占用空间的一部分进行分配,即不会占用动态内存分配” 您可以使用 共享指针 来实现,但 唯一指针 可能更适合这里,因为它们的开销较低。

以上是关于交换对象数组是不是会影响指向它的指针的主要内容,如果未能解决你的问题,请参考以下文章

指向对象的指针数组的动态分配

指向基点的指针可以指向派生对象的数组吗?

指向对象和继承对象的指针数组

如何创建指针数组?

在c++编程中,怎么定义对象数组的指针?

删除指针数组而不删除内存中的指向对象?