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);