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

5 c++

表达"资源所有权"是什么意思?是否拥有指针的所有权?例如,在这个答案中,表达式被用于"POD不能表达指针或资源的所有权".涉及动态内存管理的类,它们表示指针或资源的所有权吗?

Rei*_*ica 13

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

"资源"和"清理"的含义取决于具体情况.当资源是通过动态分配的内存时new,清理就是调用delete.当资源是文件描述符时,清理就是关闭它.等等.

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

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

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

std::shared_ptr<int>代表了一种更为复杂的所有权形式:"我是集体负责资源的一群朋友之一.我们最后一个被摧毁的人将清理它." 同样,在你违反语义之前,还有一些可以跳过的箍.

  • @Milan 不,我根本不是这个意思。我的意思是“标准语言”是“C++ 标准使用的语言”,类似于“法律语言”这个词“许可证或合同中使用的通常很复杂的正式语言”。 (2认同)