我有一个指针数组:pArray[rows][columns]
,其中每个元素都可以包含指向对象的指针。一些对象在堆上的main()
中实例化,有些对象本身也在堆上实例化:也就是说,我将pArray
传递给对象成员函数,并且该函数创建了一个新对象对象,并在pArray
中添加指针。
现在,当我想删除pArray
对象的指针时,这里有所有权吗?意思是,如果一个对象创建了一个新对象并在pArray
中放置了一个指针,那么只能创建者对象在该指针上调用delete吗?或者我可以通过将数组传递给它们来从main()
和其他对象执行此操作吗?
更多细节:
代码模拟网格上的捕食者猎物模型(pArray
)。所以我首先从文件中读取初始网格配置,然后在pArray
main()
上实例化对象(捕食者和猎物)。但是捕食者和猎物可以繁殖,因此物体产生新物体并将pArray
传递给它们,它们会在pArray
上实例化它们的孩子。
答案 0 :(得分:5)
使用原始指针所有权纯粹是一个概念。只要您使用原始指针,完全取决于您将指向对象的所有权分配给任何人和任何东西。这是你的设计问题。没有这样的“规则”,即创建它们的人应该删除该对象。所有权可以保留或传递。可以共享所有权(如在参考计数的所有权计划中)。同样,这是你的设计和意图的问题。
各种智能指针类将帮助您表达意图并实现您的意图。使用原始指针,你必须记住谁拥有什么,并手动完成所有事情。
答案 1 :(得分:2)
不,C ++中的指针没有“所有权”,如果指针有效(包含对数据/对象的正确引用),您可以在发出delete
命令的任何地方解除分配。
答案 2 :(得分:1)
对象的析构函数与其他方法一样受公共/受保护/私有的约束。因此,如果析构函数是公共的,那么任何人都可以在对象上调用delete。
唯一重要的是它只发生一次,并且只有在没有人再使用该对象之后才会发生。
答案 3 :(得分:1)
C ++中的指针没有所有权概念。就我理解你的问题而言,是的,你可以在动态内存分配的情况下从main()中删除该对象。分配给该对象的内存只有在程序结束或Object数组超出范围并且调用类的析构函数时才会被释放。