【问题标题】:How to delete a pointer to an array of objects without deleting the objects themselves? C++如何在不删除对象本身的情况下删除指向对象数组的指针? C++
【发布时间】:2020-07-13 19:28:43
【问题描述】:

我有一个指向一组对的指针 - pair(K, V)* myPairs - 有问题的实例是 with (string, Set(string)) 其中 Set 是一个二叉搜索树类。我正在尝试创建一个使 myPairs 大小翻倍的函数,所以我:

  • 创建 newPairs 并复制 myPairs 中的数据
  • 删除我的配对
  • 将 myPairs 设置为 newPairs

问题是删除 myPairs 也会调用关联集的析构函数,但我仍然想访问该数据。我怎样才能避免这种情况???

【问题讨论】:

  • 请显示问题所在minimal reproducible example(例如:为什么调用原始对象的析构函数会出现问题)
  • "我有一个指向一组对的指针..." - 为什么?为什么不简单地使用std::set(或std::vector)?
  • 这可能是您设置的课程的问题。从集合中删除移动/复制的内容不应影响新集合。
  • 复制步骤应该已经为您解决了这个问题。确保您正确观察了Rule of Three or Rule of Five。五个听起来可能比三个更适合这里。
  • 投票暂时关闭它。不是一行代码。猜谜游戏毫无意义。

标签: c++ pointers binary-search-tree destructor std-pair


【解决方案1】:

如何在不删除对象本身的情况下删除指向对象数组的指针? C++

你没有。数组的元素是数组的一部分。没有办法解决这个问题。

我怎样才能避免这种情况???

使用另一种数据结构。如果您需要调整数据结构的大小,并且在调整大小时需要元素保持有效,那么数组不是一个选项。基于节点的数据结构可以做到这一点。你想要一套,标准库附带std::set,恰好满足你的要求。

【讨论】:

    【解决方案2】:

    如果数组本身丢失,您将无法访问数组的元素!

    当您创建一个数组时,它的所有元素都存储在分配给数组本身的内存中。除非您明确地为它们分配内存,否则数据(在本例中为您的对象)将与数组一起被销毁。

    如何解决?:动态。 使用堆为您提供帮助。动态创建您的数组。

    原因是,在堆内存中创建的对象不会与指针一起被销毁,除非您明确地命令它。

    您现在可以删除您的指针,您的数组仍然保留在存储中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      相关资源
      最近更新 更多