12.1 动态内存与智能指针(1)

//练习12.10-11 
shared_ptr<int> p(new int(42));
//process(p);
//process(shared_ptr<int>(p)); //用p来初始化创建一个临时的智能指针
                             //也指向p所指向的内存 
process(shared_ptr<int>(p.get())); //用p.get()返回的内置指针来初始化创建一个
                                   //临时的智能指针,指向p所指向的内存
                                   //当离开process函数的作用域时,这个临时智能指针会被销毁
                                   //其所指向的内存也被释放掉
                                   //因为调用结束后指向这块内存的智能指针数为0 
                                   //导致再次使用这块内存时会得到未定义的结果 
int i = *p; cout << i;

//练习12.11的函数
void process(shared_ptr<int> ptr)
{
  //Do Something...
}
//练习12.12
auto p = new int();
auto sp = make_shared<int>();
process(sp); //正确
//process(new int()); //错误,传入的是一个局部临时int*内置指针
//process(p); //错误,传入的是一个int*内置指针
process(shared_ptr<int>(p)); //正确,将int*指针强制类型转换为智能指针
                             //并传入一个临时局部的智能指针
                             //函数调用返回时这个局部指针会被销毁 
                             //计数变为0
                             //其指向的空间也将会被自动释放 
//练习12.13
auto sp = make_shared<int>(42);
auto p = sp.get();
delete p; //没有释放其所指向的内存
          //因为仍有智能指针sp指向这块内存
          //计数为1
cout << sp.use_count() << endl; 
cout << *sp << " " << *p;

切忌混用智能指针和内置指针,特别是用内置指针初始化智能指针,即

int *p = new int(42);
shared_ptr<int> sp(p);

  

posted @ 2016-04-04 20:19  ChenZhongzhou  阅读(224)  评论(0编辑  收藏  举报