C++智能指针(一)智能指针的简单介绍

https://blog.csdn.net/nou_camp/article/details/70176949

C++智能指针 
在正式了解智能指针前先看一下下面的一段代码

#include<iostream>
using namespace std;
class A
{
public:
    A()
        :_ptr(NULL), _a(0)
    {}
    ~A()
    {}
public:
    int* _ptr;
    int _a;
};

void test()
{
    A a;
    int *p1 = new int(2);
}
int main()
{
    test();
    system("pause");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这个代码仅从编译运行是的角度是没有问题的,但是细心看很明显这段代码是不负责任的,因为它存在内存泄漏。只是释放了_ptr,但是p1压根没释放。在这里看起来内存泄漏没有对结果造成什么,但是千万不要小瞧内存泄漏,这是个很严重的问题。如果一个特别大的项目中存在很多很多的内存泄漏问题,一开始可能没有什么问题,但是过一段时间服务器可能会挂掉,这就是内存泄漏导致内存不够用产生的。 
为了解决这些问题,可以采用下面这种方法。

#include<iostream>
using namespace std;
void fun()
{
    throw 2;
}
int main()
{
    try{
        fun();
    }
    catch (int e)
    {
        cout << e << endl;
    }
    system("pause");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

异常对象在传给对应的catch处理后撤销。这样做是可以的,但是如果代码中有比较多的异常,这样显然不合适,大量的try catch会影响代码逻辑,导致代码丑陋不堪。为了解决这个问题,引入了智能指针。 
说到智能指针,必须知道RAII 
RAII:资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针只是RAII的一种应用。 
智能指针:所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。 
智能指针的发展可分为三个部分, 
1.auto_ptr 管理权的转移–带有缺陷的设计–c++98/03 
2.scoped_ptr(boost) unique_ptr(c++11) 防拷贝 –简单粗暴的设计 –功能不全 
3.shared_ptr(boost/c++11) 引用计数 –功能强大(支持拷贝,支持定制删除器) 缺陷–循环引用(可采用weak_ptr配合解决)


猜你喜欢

转载自blog.csdn.net/sinat_35297665/article/details/80068052
今日推荐