gpt4 book ai didi

c++ - 在 Delphi 中明确表达所有权

转载 作者:可可西里 更新时间:2023-11-01 17:51:28 26 4
gpt4 key购买 nike

我主要是一名 C++ 程序员,我已经习惯了类模板,如 std::unique_ptr , std::shared_ptr等来表达我的对象的所有权。 Delphi 的标准库中是否有类似的东西?在编写代码时,是否有任何我应该遵循的表达对象所有权的最佳实践?

编辑:自从 C++11 成为标准以来,有两个轻量级辅助类,std::shared_ptrstd::unique_ptr .

如果我创建一个 std::shared_ptr<int> 类型的变量,它表示指向具有共享所有权的 int 的指针:在引擎盖下是引用计数,当引用计数达到零时,指针将自动释放。这种类型表达了一种“共享所有权”,其中许多对象在使用完资源后共同承担销毁资源的责任。

相比之下,std::unique_ptr表示单一所有权。当 unique_ptr 超出范围时,资源将自动释放。 std::unique_ptr 不可复制:一次只能有一个对象拥有该资源,并且只能有一个对象负责清理该对象。

将这些轻量级类与指向 int 的裸指针进行对比,它可以表示共享所有权、唯一所有权,或者它可以只是对其他地方对象的引用!类型不会告诉您任何信息。

我的问题是:由于 Delphi 支持持有对对象的引用,是否有任何机制可以明确声明“我是这个对象的唯一所有者,当我用完它时,我将释放它”,而不是“我是仅仅为了与它交互而保留对该对象的引用,但其他人会清理它”与“我与许多其他对象共享该对象,最后拥有它的人可以清理它。”

我知道 Collections.Generics 有不同的集合,例如 TList对比TObjectList ,其中 TObjectList 将释放存储在其中的成员,但 TList 不会。你可以说 TObjectList “拥有”它的元素,而 TList 没有。真的,这就是我的问题的本质。在设计我自己的类时,有没有办法在语言中直接表达这些类型的所有权问题?或者是否有任何开发人员之间通用的最佳实践/命名约定?

最佳答案

我不知道有任何语言结构可以提供帮助,也不知道有任何“标准命名约定”。

然而,很久以前,我采用了以下命名约定,以便更轻松地检查类是否在其自身后正确清理:

  • 根据标准的 Delphi 约定,所有字段名称都以“F”开头。
  • 类具有/承担生命周期管理责任的对象引用,以“FMy”开头。
  • 通过在析构函数中将引用设置为 nil 来显式释放类的接口(interface)引用(为了提高性能,打破循环依赖等)以“FMi”开头

非常粗糙,但它确实有效,并且在检查你有一段时间没见过的代码时帮助很大,以防止出现“等等,不应该释放或取消该引用吗?”的问题。搜索。

关于c++ - 在 Delphi 中明确表达所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18764620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com