您的位置:首页 > 编程语言 > C语言/C++

读书笔记:C++ primer 5th edition--chapter12.动态内存

2016-10-11 00:14 447 查看
part1.智能指针
1.是一种模板。
2.通用的操作:     shared_ptr < list < int > > p2;
     if( p2 ){…}//若p2指向一个对象则为true
     p2.get()     //返回p2中保存的指针
3.shared_ptr独有操作:
     make_shared < T > (args);     //最安全的分配和使用动态内存的方法
     shared_ptr < T > p(q);          //p是q的拷贝,q ++,p --
     p.unique()                              //p.use_count == 1?
eg:     auto p3 = make_shared < int > (42);
4.shared_ptr可以自动销毁所管理的对象,以及相关联的内存

part2.动态内存
1.使用原因:程序不知道需要使用多少对象,不知道所需对象的准确类型,需要再多个对象间共享数据
2.在类中通常把数据成员用shared_ptr来管理
3.直接管理内存
1) int *pi1 = new int;//默认初始化,未定义
     int *pi2 = new int (); //带上括号,为值初始化为0
     区别:默认初始化的值可能未定义
2)new 分配const是合法的。
     const int *pci = new const int(1024);
3)定位new是不会抛出异常的。
     int *p = new (nothrow) int //分配失败会返回空指针
4)离开作用域时,动态内存要么手动释放,要么返回该指针。否则就没有办法释放这块内存。
5)坚持只使用智能指针

part3.结合shared_ptr和new
1.shared_ptr <int > p (new int (42) );//explicit的,必须使用直接初始化形式
2.不要混合使用普通指针与智能指针。当吧shared_ptr绑定到普通指针上,就不要用内置指针来访问shared_ptr所指向的内存了。
3.不要用get初始化另一个智能指针或为其赋值。get的作用是需要向不能使用智能指针的代码传递一个内置指针。此代码不能delete此指针。否则其他指向对象的指针会变成空悬。

part4.智能指针基本规范:
1.不适用相同的内置指针初始化多个智能指针
2.不delete get()返回的指针
3.不用get()初始化或reset另一个智能指针
4.管理的资源如不是new分配的内存,要传递一个删除其。否则默认是动态内存,使用delete。

part5.unique_ptr and weak_ptr
1.不能拷贝unique_ptr,除了在其要被销毁前。比如return。
2.weak_ptr:不控制所指向对象生存期。将weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。
3.使用前要用lock检查对象是否存在。
if ( shared_ptr <int > np = wp.lock() ) {   //safe  }
4.可以作为伴随指针类,用来检查,阻止访问不存在的对象。

part6.动态数组
1.建议使用标准库容器,而非动态分配的内存
2.c++11可以提供元素初始化列表,但不能用auto分配
string *psa3 = new string[ 10 ] { “a”, “bb”,”the”,... }
3.可以分配空数组,但无法解引用。所得指针就如尾后指针那样。可以加减。
     char *cp = new char[0];
4.销毁时按逆序销毁。
5.shared_ptr不支持动态数组管理

part7.allocator类
1.可以实现内存分配和对象构造分离
2.是一个模板
3.申请:
     allocator <string >alloc;
     auto const p = alloc.allocate(n);
     auto q = p;
     alloc.construct(q++,10, ‘c');
释放:
     while(p!=q)
          alloc.destroy(—q);
     alloc.deallocate(p, n); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 智能指针