【问题标题】:What does "owning" mean in the context of programming? [duplicate]在编程的上下文中,“拥有”是什么意思? [复制]
【发布时间】:2021-10-11 20:06:00
【问题描述】:

cppreference 用它来描述 std::string_view:

devtutsodocumentation 也可以用它来描述 std::string_view:

C++17 引入了std::string_view,它只是一个非拥有范围 const chars,可实现为一对指针或一个指针和一个 长度。

还有various other questions and answers 在这里 参考它,但我找不到任何解释它的含义。

【问题讨论】:

  • 拥有一个对象意味着有责任删除它,也就是调用它的析构函数。在 shared_ptr 的情况下,这意味着多个所有者,所有者有责任确保最后拥有该对象的人将其删除。
  • 在这种情况下,拥有意味着负责内存管理,尤其是释放分配的内存。
  • 当您尝试将c++ ownership into a search engine 放入时发生了什么?还是c++ what is ownership
  • 这能回答你的问题吗? What is ownership of resources or pointers?我发现它是第二个查询的第二个结果。

标签: c++ string-view


【解决方案1】:

您可以拥有资源,即任何数量有限的东西。这通常是内存或系统句柄。任何拥有资源的人都有责任在使用完资源后释放它。

std::unique_ptrstd::shared_ptr拥有 包装器的示例。当它不再使用时,它会释放它们的内存。任何其他 RAII 类也是如此。

std::basic_string_viewnon-owning,这是一种很好的说法,它不会以任何方式绑定到字符串的实际生命周期,如果你不小心,它如果字符串重新分配,可能会悬空。

【讨论】:

  • 这个全面易懂
【解决方案2】:

“拥有X”意味着对X的生命周期负责。

std::string 的情况下,该类包含char 的数组。 std::string 类负责分配和释放 char 数组;字符串对象一直拥有这个数组。

std::string_view 相比,只有“知道”这样的数组;它不会对其进行任何分配或解除分配。

好处是您不需要复制可能会变得昂贵的数组,缺点是如果您不小心,可以在停止使用 std::string_view 之前释放数组,结果在未定义的行为中,因此结果可能是您的程序崩溃。

【讨论】:

  • @IWonderWhatThisAPIDoes 这就是我写“可能崩溃”的原因;在答案中澄清了一点......
【解决方案3】:

An answer to a question about std::span 说:

span<T> 是:

...

  • 非拥有类型(即 "reference-type" 而不是“值类型”):它从不分配或释放任何东西,并且 不会使智能指针保持活动状态。

链接的答案很好地解释了参考类型是什么。

std::string_view 和 std::span 是具有引用语义的对象。 isocpp's faq 提供了很好的解释。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2011-04-27
  • 2022-01-08
  • 2015-09-16
  • 2020-10-27
相关资源
最近更新 更多