C++ 注解

智能指针

C++11,再管理动态分配内存上,引入的智能指针。哥们理解为,是原生指针raw point 的高级封装。

C++98 就提供了auto_ptr,但是,到了C++11后,不再建议使用,摒弃了auto_ptr,而是提供了unique_ptr , share_ptr与weak_ptr等

动态内存分配,能够有效的避免内存泄露的问题

多线程,多进程的动态分配内存中,常常可能因为某些原因,在释放内存,delete指针指向的内存之前,崩溃,异常捕获,造成内存泄露,悬挂指针问题

(当然还有可能忘记delete,这个就是程序员的问题了)

智能指针,将无需记住稍后释放这些new的内存,在智能指针过期时,这些内存将自动释放,你可以不用再担心释放问题(%90)

智能指针是具有线程安全的,shared指针中有个引用计数,并且引用计数的增加是原子操作。

需要注意的是,raw原生指针,与智能指针最好不要混用。

错误示例

1
2
3
4
5
6
7
using namespace std;
//原生指针
double * raw_ptr = new double (3.14);
//将原生指针指向赋予给了一个唯一指针
auto uni_ptr = make_unique<double(raw_ptr);
//将原生指针的内存释放了
delete raw_ptr;

正常编译,但是运行就会出现段错误,

可见,uni_ptr 并不能知道自己指向的内存已经释放,然后自动释放的时候二次调用这个产生的悬挂指针.

同理 ,分别定义了两个唯一指针,有了原生指针的参与,并不能保证指向的值是唯一的,所以也会触发段错误。

1
2
3
4
unique_ptr<double> ptr_uni1;
ptr_uni1 = unique_ptr<double>(raw_ptr);
unique_ptr<double> ptr_uni2;
ptr_uni2 = unique_ptr<double>(raw_ptr);