C++11:智能指针

一.简介

C++ 中动态内存的管理是通过 new 和 delete 来配对使用。但是我们可能存在忘记释放内存的情况,为了更好的托管动态内存,C++11 提供了两种智能指针类型来管理动态对象

shared_ptr 允许多个指针指向同一个对象,weak_ptr 类指向 shared_ptr 所管理的对象 

unique_ptr 独占所指向的对象

都定义在 memory 头文件中

shared_ptr<T> p         //空智能指针,可以指向类型为T的对象
unique_ptr<T> p 
p                       //将p用作一个条件判断,若p指向一个对象,则为true
*p                      //解引用p获得它指向的对象
p->get()                //返回p中保存的指针
swap(p, q)              //交换p q中的指针
p.swap(q)

Shared_ptr<T> p(q)
Shared_ptr<T> p(q, d)
Shared_ptr<T> p(p2, d)
p.reset()
p.reset(q)
p.reset(q, d)

 

二.Shared_ptr

shared_ptr 最初实现于 Boost 库中,最后被 C++ 标准委员会收录于 C++11 中

shared_ptr是一种智能指针,作用如同指针,但会用引用计数记录不同的shared_ptr指向同一个对象,一旦对象的引用计数变为0,对象就会自动删除

1.初始化

#include <iostream>

using namespace std;

int main()
{
  //默认初始化的智能指针保存着一个空指针
  shared_ptr<string> p1;
  if(!p1)
    cout<<"p1==NULL"<<endl;

  //初始化
  shared_ptr<string> p2(new string);
  if(p2 && p2->empty()){
    *p2 = "helloword"
    cout<< *p2 <<endl;
  }

  //一般的初始化方式
  shared_ptr<string> print(new string("normal usage!"));
  cout<<*print<<endl;

  //推荐安全的初始化方式
  shared_ptr<string> print1 = make_shared<string>("safe uage!")
  cout<< *pint1 <<endl;

}
// 错误初始化方式
shared_ptr<int> pa = new int(1);

int* p = new int(32);
shared_ptr<int> pp(p);
cout<< *pp << endl;

delete p;
cout<< *pp <<endl;

2.get()

get()返回一个内置指针,指向智能指针的管理对象

#include <iostream>
#include <memory>
using namespace std;

void useShared_ptr(int* p)
{
  cout<< *p <<endl;
}

void delePointer(int* p)
{
  delete p;
}

int main(int argc, char* argv[])
{
  shared_ptr<int> p1 = make_shared<int> (32);
  // shared_ptr<int> p2(p1.get())  错误,他们各自有内存的引用计数,不能拷贝过去

  useShared_ptr(p1.get());
  // delePointer(p1.get())  错误

  return 0;

}

3.make_shared<>()

安全分配和使用动态内存的方法是调用 make_shared() 标准库函数,此函数在动态内存中分配一个对象并初始化它,返回此对象的shared_ptr

#include <iostream>
using namespace std;

int main()
{
  shared_ptr<int> p3 = make_shared<int>(42);
  cout<< *p3 <<endl;

  shared_ptr<string> pstr = make_shared<string>("99999");
  cout<< *pstr <<endl;

  shared_ptr<int> pint = make_shared<int>();
  cout<< *pint <<endl;

  auto pau = make_shared<string>("auto");
  cout<< *pau <<endl;
 
}

4.shared_ptr的拷贝和赋值

 

5.引用计数

原文地址:https://www.cnblogs.com/k5bg/p/11474759.html