c++之智能指针初探

为什么要引入智能指针:

在C++中,动态内存的管理一般是用一对运算符完成的:new和delete,
new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,
delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。

int *b=new int(5);
delete(b);

使用new和delet动态内存管理经常会出现问题: ( ̄へ ̄)

忘记释放内存,会造成内存泄漏;
尚有指针引用内存的情况下就释放了它,产生引用非法内存的指针。
一块内存释放两次。
等。。。

所以,为了更加容易(更加安全)的使用动态内存,引入了智能指针的概念。
智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。 o(≧口≦)o

智能指针概念:

通俗的说:智能指针其实就是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。

STL (模板库)一共给我们提供了四种智能指针:
auto_ptr、unique_ptr、shared_ptr、weak_ptr,

auto_ptr是C++98提供的解决方案,C+11已将其摒弃,并提出了unique_ptr作为auto_ptr替代方案。虽然auto_ptr已被摒弃,但在实际项目中仍可使用,但建议使用较新的unique_ptr,因为unique_ptr比auto_ptr更加安全,后文会详细叙述。
shared_ptr和weak_ptr则是C+11从准标准库Boost中引入的两种智能指针。
weak_ptr被设计为与shared_ptr共同工作,weak_ptr是为了配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手。

此外,Boost库还提出了boost::scoped_ptr、boost::scoped_array、boost::intrusive_ptr 等智能指针,虽然尚未得到C++标准采纳,但是实际开发工作中可以使用。(‾◡◝)

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。

智能指针思想

当两个指针a、b都指向同一个对象时,a过期时删除对象一次,b过期时删除对象一次,所以等于删除了同一个对象两次。有什么解决办法呢? (-∀=)

  1. 定义赋值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费空间,所以智能指针都未采用此方案。
  2. 建立所有权(ownership)概念。对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的析构函数会删除该对象。然后让赋值操作转让所有权。这就是用于auto_ptr和unique_ptr 的策略,但unique_ptr的策略更严格。
  3. 创建智能更高的指针,跟踪引用特定对象的智能指针数。这称为引用计数。例如,赋值时,计数将加1,而指针过期时,计数将减1,。当减为0时才调用delete。这是shared_ptr采用的策略。

auto_ptr 和 unique_ptr

auto_ptr 是STL中智能指针家族的成员之一,由C++98引入,定义在头文件。其功能和用法类似于unique_ptr,由 new expression 获得对象,在 auto_ptr 对象销毁时,他所管理的对象也会自动被 delete 掉。
auto_ptr和unique_ptr都是“独占”所指向的对象。 ( ﹁ ﹁ ) ~→
类似这样:

首先a指向object:

再让b指向object:
c++之智能指针初探_第1张图片
可以看到,b自动独占了object的对象。
那么为什么c++11抛弃了auto_ptr而换成了unique_ptr呢?

是因为如果使用auto_ptr,当让b指向object后,如果出现无意识使用了a,那么就会出现程序崩溃。
就像这样:

	auto_ptr<string> a (new string("hello"));
    auto_ptr<string> b;
    b=a; //  将所有权从a转让给b,此时a不再引用该字符串从而变成空指针
    cout<< *b <<endl;

你可能感兴趣的:(技术总结,智能指针,c++)