指针所有权

Pointer Ownership

本文关键字:所有权 指针      更新时间:2023-10-16

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

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

更多细节:

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

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

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

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

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

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

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