c++ - 什么是资源或指针的所有权?

标签 c++

表达“资源的所有权”是什么意思?它与拥有指针的所有权一样吗?例如在 this answer ,使用了表达式“PODs cannot express ownership of pointers or resources”。涉及动态内存管理的类,它们是否表示指针或资源的所有权?

最佳答案

我不认为有一个普遍接受的、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>代表一种更复杂的所有权形式:“我是一群共同负责资源的 friend 之一。我们中最后一个被摧毁的人将清理它。”同样,在违反语义之前,需要跳过几个环节。

关于c++ - 什么是资源或指针的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49024982/

相关文章:

c++ - localtime_r对于大数返回null

c++ - 我的计算器程序 C++ 出现错误

c++ - 我的程序在不同的机器上给出不同的输出..!

c++ - 打印出文件的最后 10 行

javascript - 为什么 C++ CGI form_iterator 值没有进入 XMLHttpRequest 异步 Ajax 请求?

c++ - vector 下标超出范围 - 冒泡排序 - 改进

c++ - 逐字阅读文本文件时,如何忽略 "end of line"或 "new line"字符?

c++ - 读取应用程序的 list 文件?

c++ - 取整并通过 XML-RPC 发送

c++ - 为什么 std::filesystem::file_size 位于留给实现的目录上?