【问题标题】:Pointer Ownership指针所有权
【发布时间】:2012-07-07 19:02:30
【问题描述】:

我有一个指针数组:pArray[rows][columns],其中每个元素都可以包含一个指向对象的指针。有些对象是在堆上的main()中实例化的,有些对象本身也在堆上实例化:也就是说,我将pArray传递给一个对象成员函数,该函数创建了一个新对象,并将pArray 中指向它的指针。

现在,当我想从pArray 中删除指向对象的指针时,这里有所有权吗?意思是,如果一个对象创建了一个新对象并在pArray中放置了一个指向它的指针,那么只有创建者对象才能对该指针调用delete吗?或者我可以通过将数组传递给main() 和其他对象来实现吗?

更多细节:

代码在网格 (pArray) 上模拟捕食者猎物模型。因此,我首先从文件中读取初始网格配置,并在 pArray 上从 main() 实例化对象(捕食者和猎物)。但是捕食者和猎物可以繁殖,所以对象会产生新对象,并通过将pArray 传递给它们,它们会在pArray 上实例化它们的子对象。

【问题讨论】:

  • 无法笼统地回答这个问题。您可以根据代码的意图找出所有权问题。但是你可以在任何地方调用delete,只要对每个对象只调用一次,并且一旦对象被删除就不要尝试使用它。智能指针通常可用于减轻跟踪所有权的负担。
  • 这些对象有一个“所有者”有意义吗?如果没有,你应该看看shared_ptr
  • 听起来你好像在问一个引用计数问题,它在 COM 中处理(如果你在 Windows 上)。我不了解非 Windows 平台。

标签: c++ pointers


【解决方案1】:

对于原始指针,所有权纯粹是一个概念。只要您使用原始指针,您就可以将指向对象的所有权分配给任何人和任何事物。这是你的设计问题。没有这样的“规则”,即对象应该由创建它们的人删除。所有权可以保留或传递。所有权可以共享(如在引用计数所有权方案中)。同样,这取决于您的设计和意图。

各种智能指针类将帮助您表达您的意图并实现您的意图。使用原始指针,您必须记住谁拥有什么并手动执行所有操作。

【讨论】:

    【解决方案2】:

    不,C++ 中的指针没有“所有权”,如果指针有效(包含对数据/对象的正确引用),您可以在任何地方发出delete 命令将其释放。

    【讨论】:

    • 我没有投反对票,但我认为说没有所有权是夸大其词。所有权是程序员应该意识到的一个通用概念,它只是不被语言强制执行。
    【解决方案3】:

    对象的析构函数与其他所有方法一样受制于相同的公共/保护/私有。因此,如果析构函数是公开的,那么任何人都可以对对象调用 delete。

    唯一重要的是它只发生一次,并且只有在没有人再使用该对象之后。

    【讨论】:

      【解决方案4】:

      C++ 中的指针没有所有权概念。据我了解您的问题,是的,在动态内存分配的情况下,您可以从 main() 中删除该对象。分配给该对象的内存只有在程序结束或对象数组超出范围并调用该类的析构函数时才会被释放。

      【讨论】:

        猜你喜欢
        • 2020-07-28
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多