CppPrimer笔记 Chapter12 动态内存
来源:互联网 发布:cad怎么修改网络计划图 编辑:程序博客网 时间:2024/05/18 11:49
CppPrimer笔记 Chapter12 动态内存
标签: Cpp
- CppPrimer笔记 Chapter12 动态内存
- 动态内存与智能指针121
- 动态数组122
动态内存与智能指针(12.1)
shared_ptr
允许多个指针指向同一个对象
指向shared_ptr
所管理的对象- 智能指针可以认为是能记录有多少个指向相同对象,因而能在恰当时调用析构函数自动释放
- 使用动态内存的三种原因
- 程序不知道自己需要使用多少对象(动态数组)
- 程序不知道所需对象的准确类型(第15章)
- 程序需要在多个对象间共享数据(通过类成员取值
shared_ptr
来构建一个可以共享的,会自动销毁的对象)
- delete一个指针后,指针值变为无效.但仍保存了已经释放了的动态内存的地址.为
悬空指针
- delete一个动态分类的对象的指针时将执行析构函数
- 接受指针参数的智能指针构造函数是
explicit
(禁止隐式类型转换)因而
shared_ptr<int> p1 = new int(1024);//error shared_ptr<int> p2(new int(1024)); //okshared_ptr<int>clone(int p){ return new int(p);} //errorshared_ptr<int>clone(int p){ return shared_ptr<int>(new int(p));} //ok
- 不要混合使用普通指针与智能指针,也不好使用
get
初始化另一个智能指针,或为智能指针赋值
void process(shared_ptr<int> ptr){} int *x(new int(1024)); process(x);//error int*不能转化为shared_ptr<int> process(shared_ptr<int>(x)); int j = *x;//未定义:x在process中被释放了 shared_ptr<int> p(new int(42)); int *q = p.get(); {shared_ptr<int> g(q);}//new block end,g释放了p的对象 int foo = *p;//未定义 使用悬空指针
- 发生异常时,直接管理的内存是不会被自动释放的
shared_ptr<connection>p(&c,end_connection);
会调用end_connection来进行销毁,这时c 不是由new分配的内存 也务必调用删除器而不是默认的delete
unique_ptr
独占所指向的对象,
构建时需要绑定到一个new返回的指针上,同样只能采用直接初始化.
由于为独占,不支持拷贝操作,
但可以用release()
或reset
将(非const unique_ptr)指针的所有权进行转移.注意release()
放弃指针时造成的指针丢失release()
对于指针类型,会销毁管理的指针(调用delete[])unique_ptr<objT,delT>p(new objT,fcn)
其调用自定义删除函数类似关联容器
而与shared_ptr
有区别weak_ptr
为弱引用,将weak_ptr
绑定到一个shared_ptr
,
但不会改变shared_ptr
的引用计数,因而可能会不存在,要利用lock
来访问
动态数组(12.2)
allocator
为了使得内存分配与对象初始化分离.进而可以没有默认构造函数也可以动态分配内存- 使用
allocator
allocator<string> alloc; int n = 10; auto const base = alloc.allocate(n); auto q = base; alloc.construct(q++); alloc.construct(q++,10,'c'); alloc.construct(q++,"hi"); cout<<*p<<endl; while(q != p)alloc.destroy(--q); alloc.deallocate(p,n);
vector<int> vec{ 1, 2, 3, 4, 5 }; allocator<int>alloc; auto const base = alloc.allocate(vec.size()*2); auto q = uninitialized_copy(vec.begin(), vec.end(), base); q = uninitialized_fill_n(q, vec.size(), 42); //注意 打印为倒序,42 42 42 42 42 5 4 3 2 1 while (q != base){ cout << *(--q) << endl; }
0 0
- CppPrimer笔记 Chapter12 动态内存
- 读书笔记:C++ primer 5th edition--chapter12.动态内存
- CppPrimer笔记 Chapter6 函数
- CppPrimer笔记 Chapter7 类
- CppPrimer笔记 Chapter8 IO库
- CppPrimer笔记 Chapter9 顺序容器
- CppPrimer笔记 Chapter11 关联容器
- CppPrimer笔记 Chapter13 拷贝控制
- CppPrimer笔记 Chapter10 泛型算法
- CppPrimer笔记 Chapter15 面对对象程序设计
- CppPrimer笔记 Chapter17 标准库特殊设施
- CppPrimer笔记 Chapter19 特殊工具与技术
- VC++深入详解·chapter12·笔记
- 【C++ Primer 学习笔记】 chapter12 类
- CppPrimer笔记 Chapter14 重载运算与类型转换
- CppPrimer笔记 Chapter16 模板与泛型编程
- CppPrimer笔记 Chapter18 用于大型程序的工具
- 【APUE】Chapter12
- 回忆录【三】
- Java解析txt文件
- POJ 1651 Multiplication Puzzle(区间dp)
- a标签获取value值
- 如何细粒度地控制你的MyBatis二级缓存(mybatis-enhanced-cache插件实现)
- CppPrimer笔记 Chapter12 动态内存
- 【算法】牛客网前端算法(20-30)
- 道听途说——JAVA文件中只能含有一个Public类
- 并发
- vs2013关闭安全函数检查
- C语言概述(1)
- Win32 GDI 学习总结
- MQTT 移植STM32+GPRS(串口透传)(二)
- laravel源码阅读之自动加载功能