【问题标题】:What is ownership of resources or pointers?什么是资源或指针的所有权?
【发布时间】:2018-08-08 01:30:16
【问题描述】:

表达“资源的所有权”是什么意思?它与拥有指针的所有权相同吗?例如,在this answer 中,使用了“POD 不能表达指针或资源的所有权”的表达式。涉及动态内存管理的类,它们是否表达了指针或资源的所有权?

【问题讨论】:

  • 您可能需要阅读RAII,它代表资源获取即初始化。

标签: c++


【解决方案1】:

我不认为有一个普遍接受的、100% 准确且始终适用的定义,但是我在 C++ 上下文中遇到的最有用的所有权定义(以及general) 是清理的责任。也就是说,资源的所有者是负责正确清理该资源的人。

“资源”和“清理”的含义取决于上下文。当资源是通过new 动态分配的内存时,清理调用delete。当资源是文件描述符时,清理将关闭它。以此类推。

这就是普通旧数据无法表达所有权的原因:POD 类必须具有无操作析构函数,因此无法执行任何自动清理。

比较 int *std::unique_ptr<int>std::shared_ptr<int>。所有这些类型都是“指向int 的指针”。但是第一个并不代表所有权——你可以用它做任何你想做的事情,并且你可以愉快地使用它来导致内存泄漏或双重释放。

std::unique_ptr<int> 代表最简单的所有权形式:它表示“我是资源的唯一所有者(= 动态分配的 int)。当我被销毁时,我会正确清理它。”它旨在不提供违反所有权语义的理智方式(例如,它是不可复制的)。

std::shared_ptr<int> 代表一种更复杂的所有权形式:“我是一群共同负责资源的朋友中的一员。我们中最后一个被摧毁的人会清理它。”同样,在您违反语义之前需要跳过一些障碍。

【讨论】:

  • 非常感谢您提供这么好的答案。我有几个问题: 什么是no-op destructor? (你说“......一个POD类必须有一个无操作析构函数......”)你能否详细说明或分享关于的有用链接“它的设计不是提供一种违反所有权语义的理智方式(例如,它是不可复制的)。”?
  • @Milan 1) 其标准是 trivial destructor:简单来说,它不是用户提供的,也不做任何事情(所有成员和基础也有微不足道的析构函数)。 2) 抱歉,手头没有。基本上,std::unique_ptr 的界面被设计成你必须跳过几圈才能滥用它(但当然可以这样做)。
  • 谢谢安吉。抱歉,还有两件事:1. standardese,您的意思是github.com/standardese/standardese 对吗? 2. 感谢您对std::unique_ptr 界面的澄清。每当您遇到一些相关资源时,请在此处分享。将不胜感激!
  • @Milan 不,我根本不是那个意思。我的意思是“standardese”是“C++ 标准使用的语言”,类似于“legalese”一词是“许可证或合同中使用的通常复杂的正式语言”。
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多