"owning" 在编程语境中是什么意思?
What does "owning" mean in the context of programming?
cppreference用它来形容
std::string_view:
std::basic_string_view
(C++17) - a
lightweight non-owning read-only view into a subsequence of a string.
devtut
和
sodocumentation
也用它来描述 std::string_view:
C++17 introduces std::string_view
, which is simply a non-owning range of
const char
s, implementable as either a pair of pointers or a pointer and a
length.
和 various other questions and answers 在这里
参考它,但我找不到任何解释它的意思。
您可以拥有资源,即任何数量有限的资源。这通常是内存或系统句柄。拥有资源的任何人都有责任在使用完后释放它。
std::unique_ptr
和 std::shared_ptr
是 owning 包装器的示例。当它不再使用时,它会释放它们的内存。任何其他 RAII class.
也是如此
std::basic_string_view
是 non-owning,这是一种很好的说法,它不以任何方式绑定到字符串的实际生命周期,而且,如果你不小心,如果字符串重新分配,它可能会悬空。
“拥有X”意味着对X的生命周期负责。
在 std::string
的情况下,class 包含 char
的数组。 std::string
class 负责分配和释放char数组;字符串对象一直拥有这个数组。
与此相反 std::string_view
只“知道”这样一个数组;它不会对其进行任何分配或解除分配。
好处是你不需要复制数组,这可能会变得很昂贵,缺点是如果你不小心,数组可能会在你停止使用之前被释放 std::string_view
这会导致未定义的行为,因此结果可能是您的程序崩溃。
说:
A span<T>
is:
...
- A non-owning type (i.e. a
"reference-type"
rather than a "value type"): It never allocates nor deallocates anything and
does not keep smart pointers alive.
链接的答案很好地解释了参考 type 是什么。
std::string_view 和 std::span 是引用 semantics 的对象。 isocpp's faq 提供了很好的解释。
cppreference用它来形容 std::string_view:
std::basic_string_view
(C++17) - a lightweight non-owning read-only view into a subsequence of a string.
devtut 和 sodocumentation 也用它来描述 std::string_view:
C++17 introduces
std::string_view
, which is simply a non-owning range ofconst char
s, implementable as either a pair of pointers or a pointer and a length.
和 various other questions and answers 在这里 参考它,但我找不到任何解释它的意思。
您可以拥有资源,即任何数量有限的资源。这通常是内存或系统句柄。拥有资源的任何人都有责任在使用完后释放它。
std::unique_ptr
和 std::shared_ptr
是 owning 包装器的示例。当它不再使用时,它会释放它们的内存。任何其他 RAII class.
std::basic_string_view
是 non-owning,这是一种很好的说法,它不以任何方式绑定到字符串的实际生命周期,而且,如果你不小心,如果字符串重新分配,它可能会悬空。
“拥有X”意味着对X的生命周期负责。
在 std::string
的情况下,class 包含 char
的数组。 std::string
class 负责分配和释放char数组;字符串对象一直拥有这个数组。
与此相反 std::string_view
只“知道”这样一个数组;它不会对其进行任何分配或解除分配。
好处是你不需要复制数组,这可能会变得很昂贵,缺点是如果你不小心,数组可能会在你停止使用之前被释放 std::string_view
这会导致未定义的行为,因此结果可能是您的程序崩溃。
A
span<T>
is:...
- A non-owning type (i.e. a "reference-type" rather than a "value type"): It never allocates nor deallocates anything and does not keep smart pointers alive.
链接的答案很好地解释了参考 type 是什么。
std::string_view 和 std::span 是引用 semantics 的对象。 isocpp's faq 提供了很好的解释。