详细介绍:C++11/14 高速上手教程
一、右值引用与std::move
如下代码:
std::string tmp("bert")
std::string name(tmp)
第一行声明了一个对象tmp,用"bert"字符串进行初始化
第二行声明了一个对象name,使用参数tmp调用string的构造函数,因此对象name复制了"bert"的一个副本,如下:
如下代码:
std::string tmp(“bert”);
std::string name(std::move(tmp));
直接将tmp中的内容移动到name中,而不是复制一份,用图表示为:
二、智能指针
-
unique_ptr
#include <string.h> #include <stdio.h> #include <memory> #include <iostream> using namespace std; class Student { public: Student() { cout << "Construct student" << endl; } ~Student() { cout << "Destruct student" << endl; } bool Register() { return true; } bool Enroll() { return true; } }; int main() { Student* p = new Student(); if (!p->Register()) { delete p; return -1; } if (!p->Enroll()) { delete p; return -2; } delete p; return 0; }
该代码使用 new 在堆上分配一个 Student 对象,并对其调用了两个成员函数:Register 和 Enroll。任意一个失败都将返回失败,并且不能忘记 delete 资源。在三处 return 语句之前,必须加上 delete p;否则就可能造成资源泄漏;如果使用 unique_ptr,就可以在指针 p 退出作用域时,自动释放所分配的资源,完整代码如下