通过常规指针管理动态内存的难点及缺点:
(1)忘记释放动态内存: 使用new/malloc分配动态内存时,需要使用delete/free手动释放内存,但程序员容易忘记释放内存,从而产生内存泄露;
(2)动态内存释放时机不对: 在尚有指针引用内存的情况下,程序员释放了内存,从而产生空悬指针。典型的案例就是:假设在多线程编程中,线程A、B中分别有指针p1、p2指向对象object,若某个时刻线程A通过p1将object销毁了(释放了object占有的内存),那么线程B中的p2引用object就会产生内存错误。
程序员手动管理动态内存的困难,促使了智能指针的产生。智能指针可以自动隐式地释放动态内存,大大减少了内存错误,方便了动态内存的管理。有很多学者都对智能指针的源码进行了剖析,我将结合源码剖析分两篇博客对auto_ptr、unique_ptr、shared_ptr、weak_ptr依次进行总结。
auto_ptr根据博客https://blog.csdn.net/yanglingwell/article/details/56011576的源码剖析进行原理总结。
auto_ptr
auto_ptr中只有一个私有成员变量,即指向_Ty类型对象的指针_Myptr。
1、构造函数
auto_ptr有三种构造方式,一是通过传入指针来初始化_Myptr,二是通过同类型的auto_ptr对象来拷贝构造,但会利用release函数将原对象指针置为空