Skip to content

15.x 十五章理解和复习

By Alex on May 3rd, 2017 | last modified by Alex on January 23rd, 2020

翻译by dashjay 2020.07.18

智能指针类是一个被设计来管理动态分配内存的组合类,并且能确保当智能指针离开作用域时内存被释放。

拷贝语义允许我们的类被拷贝,能使用拷贝构造和拷贝赋值运算符来完成。

移动语义意味着一个类将会转移对象,而不是拷贝。这通常通过移动构造和移动赋值运算符来完成。

std::auto_ptr 已经被废弃,并且应该被避免。

一个右值引用是被设计使用右值初始化的引用。一个右值引用被使用 双&符号创建。写函数的时候传入右值引用很棒,但是你应该从来不要反悔一个右值引用。

如果我们构造了一个类或者使用一个左值进行进行了一次赋值,我们能做的只有拷贝左值。我们不能假设安全的修改左值,因为它可能会在程序中被再次使用。如果我们有一个表达式 a = b,我们当然不会期待 b 被以任何方式修改。

然而,如果我们构造了一个对象或者使用一个右值进行一次赋值,然后我们就会知道右值就是一个临时值。拷贝它(会有很多开销),我们可以简单的转移(开销非常小)资源到另一个对象我们即将创建或者赋值的。这非常安全,因为临时值在表达式末尾就会被删除,因此我们知道它绝不会再次被使用。

你可以用删除关键词来为你定义的类禁用拷贝语义,这样你就删除了拷贝构造和拷贝赋值操作符。

std::move 允许你像对待一个右值那样对待一个左值。这是非常有用的,当你想要在一个左值上触发移动语义而不是拷贝语义。

std""unique_ptr 是你应该使用的智能指针类。他单独管理着一份不能分享的资源。std::make_unique()(在 C++14中)应该作为创建新 std::unique_ptr 的首选。std::unique_ptr 禁用了拷贝语义。

当你需要多个对象访问同一份资源时,可以用 std::shared_ptr 智能指针类。资源将会被销毁,直到最后一个管理该资源的 std::shared_ptr 被销毁。 std::make_shared() 应该作为创建新 std::shared_ptr 的首选。使用 std::shared_ptr,拷贝语义将会被使用来创建一个 std::shared_ptr 来指向相同的对象。

当你需要一个或者多个独享具有访问一个资源的能力时,可以使用 std::weak_ptr 智能指针,不像 std::shared_ptr 那样,std::weak_ptr 不会决定资源是否应该被销毁。