【问题标题】:Ownership and move semantics所有权和移动语义
【发布时间】:2020-09-17 14:08:15
【问题描述】:

鉴于以下所有者的定义,讨论不拥有资源的对象的移动语义是否有意义?

https://www.stroustrup.com/resource-model.pdf

所有者是一个对象,其中包含指向由 new 分配的对象的指针,需要对其进行删除。

换一种说法,为一个没有指向堆上分配的对象的指针的对象显式定义移动构造函数和移动赋值运算符是否有意义?

谢谢

【问题讨论】:

  • 这对于任何包含需要清理的资源的对象都是有意义的(我已经为包含 OpenGL id 的包装器对象做了它,文件描述符是另一个很好的对象)
  • “所有者”可能不是一个好词。这样的对象借用了一个资源,当你借用完资源时,你需要一个析构函数来返回资源。 new 只是从堆中借用内存。 “搬家”也意味着您将借用资源归还给贷方的责任。

标签: c++ move-semantics


【解决方案1】:

当然。引用的定义是一种简化。一般来说,任何使用获取/释放模式的 API 都可以支持移动语义。作为 C++11 示例,std::unique_lock 是可移动对象。它拥有一个互斥锁,而不是一个堆分配。获取/释放方法是.lock.unlock,而不是newdelete

【讨论】:

  • 所以一般来说,我们可以肯定地说,它只对可以获取和释放资源的对象有意义——无论该资源是什么?
  • @user3124390 它不需要是资源,具有不可复制但只能移动的对象在其他情况下也可以有意义,例如如果对象代表一个身份。当然还有其他可以表达所有权但与资源没有直接关系的东西。
  • @user3124390:不,这是不正确的逻辑。您最初想知道它是否只是new/delete。我展示了一个更大的类别(任何具有获取/释放行为的东西),其中包括new/delete。我没有表明(或声称)这是最大的此类类别。
  • @user3124390:另外,你写的是“资源”。有一个众所周知的原则,即每个 C++ 所有者对象都应该管理一个拥有的资源。这可能是一个数组,如std::vector<T>std::shared_ptr<T[ ]>,但资源必须可以通过一次调用释放。如果您需要更多资源,您可以嵌套所有者,例如std::vector<std::string>。这样可以保证在发生异常时释放所有分配的资源,因为每个成功分配的资源都运行一个 dtor。
  • There's a well-known principle that every C++ owner object should manage exactly one owned resource 是否与 std::vector(或至少 std::vector<std::string> 示例)相矛盾,因为它拥有多个对象? (这与struct foo { std::string str1; std::string str2} 没有什么不同?
猜你喜欢
  • 2014-12-18
  • 2014-07-30
  • 2016-02-04
  • 2020-08-20
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多