C++11新特性

智能指针是C++11引入的特性,用于解决忘记delete而出现的内存泄露问题,是行为类似指针的类对象。

4种智能指针

C++有4种智能指针:auto_ptr、shared_ptr、unique_ptr、weak_ptr,其中auto_ptr在C++11中被弃用,weak_ptr需要配合shared_ptr使用,并不能算是真正的智能指针。

unique_ptr:代替了原有的auto_ptr,它们都采用所有权模式,实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。

shared_ptr:采用引用计数实现共享式拥有,多个共享指针可以指向同一个对象,该对象和其他相关资源会在最后一个引用被销毁的时候释放。

weak_ptr:只能和shared_ptr搭配使用,用来解决循环引用问题。

实现原理

智能指针将常规指针进行包装,当智能指针对象过期时,让它的析构函数对常规指针进行内存释放。

移动语义

左值和右值

一个表达式的计算结果要么是左值,要么是右值。左值是在内存中持久存储的,位于内存具体的某个地址上;右值只是一个临时存储的值。

  • 如果一个表达式仅由一个变量名组成,那么它一定是左值。
  • 函数表达式中的参数:在调用函数时,参数是存在寄存器里的,所以是右值
  • 函数返回值:如果返回的是引用,那么是左值,其他情况返回的都是

移动构造

std::move函数

这个函数并没有移动任何东西!仅仅是做了一个类型转换,你甚至可以像下面这样简单地实现一个move函数:

1
2
template <typename T>
T&& move(T &x) noexcept { return static_cast<T&&>(x); }