读书笔记: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);
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++ primer 5th edition--chapter14.重载运算与类型转换
- 读书笔记:C++ primer 5th edition--chapter11.关联容器
- 读书笔记:C++ primer 5th edition--chapter8.IO Lib
- 读书笔记:C++ primer 5th edition--chapter9.顺序容器
- 读书笔记:C++ primer 5th edition--chapter13.拷贝控制
- 读书笔记:C++ primer 5th edition--chapter 3.字符串,向量,数组
- 读书笔记:C++ primer 5th edition--chapter17.标准库特殊设施
- 读书笔记:C++ primer 5th edition--chapter 6.函数
- 读书笔记:C++ primer 5th edition--chapter7.类
- 读书笔记:C++ primer 5th edition--chapter15.OOP
- 读书笔记:C++ primer 5th edition--chapter16.模板与泛型编程
- 读书笔记:C++ primer 5th edition--chapter10.泛型算法
- 读书笔记:C++ primer 5th edition--chapter18.用于大型程序的工具
- 读书笔记:C++ primer 5th edition--chapter19.特殊工具与技术
- C++ Primer 中文版 5th Edition 练习15.8和练习15.9的解答
- 《C++ Primer 4th Edition》读书笔记 - Part IV: Object-Oriented and Generic Programming
- 《C++ Primer 5th》读书笔记3---关于类的构造函数
- 《C++ Primer (5th Edition)》笔记-Part IV. Advanced Topics
- 《C++ Primer 3rd edition》读书笔记 - 第二篇 基本语言
- 《C++ Primer 5th》读书笔记4---文本查询程序