动态内存
- 静态内存保存局部static对象,类static数据成员,以及定义在任何函数之外的变量
- 栈内存用来保存定义在函数内的非static对象
- 分配在静态内存或者栈内存的对象由编译器自动你那个创建和销毁
- 程序使用堆来存储动态分配的对象
- 两种智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象
- shared_ptr允许多个指针指向同一个对象,unique_prt”独占“所指对象,定义在memory头文件
- 最安全的分配和使用动态内存的方法是调用make_shared
- 如果分配了动态内存,用完之后忘记释放内存,这样就会产生内存泄漏。如果在尚有指针引用内存的情况我们就释放了它,就会产生引用非法内存的指针。
- 智能指针使用规范:不使用相同的内置指针值初始化(或reset)多个智能指针;不delete get()返回的指针;不使用get()初始化或reset另一个智能指针;如果使用get()返回的指针,记住当最后一个对应的智能指针销毁后,返回的指针就无效了;如果使用智能指针管理的资源不是new分配的内存,记得传递给它一个删除器。
- unique_ptr,定义时,我们需要将其绑定到一个new返回的指针
- 类似shared_ptr,unique_ptr的初始化必须采用直接初始化形式
- unique_ptr不支持普通的拷贝或赋值。(例外,可以拷贝或赋值一个将要被销毁的unique_ptr,例如函数返回)
- unique_ptr对指针的所有权可以由release或reset来转移
- 创建一个weak_ptr 的时候,用shared_ptr来初始化
- weak_ptr不会改变shared_ptr所指对象的计数
- 由于对象有可能不存在,所以不能使用weak_ptr直接访问对象,而应该调用lock。P420
- weak_ptr不会影响所指对象的生存期
- 大多数应用应该使用标准库容器而不是动态分配的数组。使用容器更为简单,更不容器出现内存管理错误且可能有更好的性能
- 动态数组并不是数组类型,返回的是一个元素类型的指针,因此不能对动态数组调用begin或end,也不能用范围for语句来处理动态数组中的元素
- delete p // p必须指向一个动态分配的对象或为空
- delete [] pa //pa必须指向一个动态分配的数组或为空
- 标准库allocator类定义在头文件memory中,帮助我们将分配内存和对象构造分离开来
- allocator分配的内存是未构造的
- 为了使用allocator返回的内存,我们必须使用construct构造对象
- 当使用完对象后,必须对每个构造的元素调用destroy,来执行对象的析构函数
更多学习资料,请关注下面的公众号:不定期分享
- 深度学习网络总结
- 机器学习算法及其应用场景
- 算法与数据结构(leetcode 题解)
- cuda编程与并行优化
- 其他读书分享如:《战国策》,《智囊全集》
- 宇宙常识科普与星座辨别
- 等等