【发布时间】:2018-08-08 01:30:16
【问题描述】:
表达“资源的所有权”是什么意思?它与拥有指针的所有权相同吗?例如,在this answer 中,使用了“POD 不能表达指针或资源的所有权”的表达式。涉及动态内存管理的类,它们是否表达了指针或资源的所有权?
【问题讨论】:
-
您可能需要阅读RAII,它代表资源获取即初始化。
标签: c++
表达“资源的所有权”是什么意思?它与拥有指针的所有权相同吗?例如,在this answer 中,使用了“POD 不能表达指针或资源的所有权”的表达式。涉及动态内存管理的类,它们是否表达了指针或资源的所有权?
【问题讨论】:
标签: c++
我不认为有一个普遍接受的、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类必须有一个无操作析构函数......”)你能否详细说明或分享关于的有用链接“它的设计不是提供一种违反所有权语义的理智方式(例如,它是不可复制的)。”?
std::unique_ptr 的界面被设计成你必须跳过几圈才能滥用它(但当然可以这样做)。
std::unique_ptr 界面的澄清。每当您遇到一些相关资源时,请在此处分享。将不胜感激!