指针所有权

时间:2012-07-07 17:22:02

标签: c++ pointers

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

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

更多细节:

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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