【问题标题】: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 只有伴随着细化才有用......

标签: c++ arrays c++11 pointers


【解决方案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; 包含一个值,则保证该值作为可选对象占用空间的一部分进行分配,即不会占用动态内存分配” 您可以使用 共享指针 来实现,但 唯一指针 可能更适合这里,因为它们的开销较低。
      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多