C++面经漏洞汇总

C++中几种智能指针的区别

为什么要使用智能指针:

智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间

1. auto_ptr(c++98的方案,cpp11已经抛弃)

弃用原因:当两个智能指针都指向同一个堆空间时,每个智能指针都会delete一下这个堆空间,这会导致未定义行为。同时由于使用了转移语义(就是下面的p1将控制权转给p2),在使用p1会出现内存崩溃。

采用所有权模式。

auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”));
auto_ptr<string> p2;
p2 = p1; //auto_ptr不会报错.

此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是:存在潜在的内存崩溃问题!

针对这个问题有3种策略:
1、进行深度复制,有几个指针就复制几个对象;
2、制定指针专有权的概念。即,只有一个智能指针能真正指向一个特定的对象, 也只有该指针能析构这个对象所占用的空间,直到把这个指针赋给另一个指针,后一个指针才能真正指向这个对象,而前一个指针就不再起作用了, 从而避免了两次delete而导致的未定义行为这个概念比较适合auto_ptr和unique_ptr,但后者要求更严格(unique_ptr)
3、 记录性智能指针。即, 有一个智能指针指向某对象,就把这个对象上的智能指针数加1,有一个指针不再指向该对象,就把这个对象上的智能指针数减1。只有当最后一个智能指针生命期结束了,才真正释放对象空间。(shared_ptr)

猜你喜欢

转载自www.cnblogs.com/lxy-xf/p/11420071.html