10.动态分配内存(未完)

10.1.什么是智能指针?跟普通指针有什么区别?

是C++标准库给我们提供的用于管理动态对象的模板。行为和普通指针一样,但是主要区别在智能指针自动释放所指向的对象,避免造成内存泄漏。

10.2.智能指针的工作原理?

(1)构造函数中计数初始化为1;

(2)拷贝构造函数中计数值加1;

(3)赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;

(4)析构函数中引用计数减一;

(5)在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。

10.3.share_ptr的计数器怎么工作?

(1)拷贝一个shared_ptr计数器加1

(2)用一个shared_ptr初始化另一个shared_ptr计数器加1

(3)将shared_ptr作为参数传递给一个函数或者作为函数返回值计数器加1

(4)给shared_ptr赋予一个新值减1

(5)shared_ptr被销毁,局部的shared_ptr离开作用域减1

10.4.weak_ptr和shared_ptr的区别

weak_ptr:是一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr管理的对象。

(1)shared_ptr 控制对象的生命期。shared_ptr 是强引用 ,只要有一个指向 x 对象的 shared_ptr 存在,该 x 对象就不会析构。 当指向对象 x 的最后一个 shared_ptr 析构或 reset 的时候, x 保证会被销毁。

(2)weak_ptr 不控制对象的生命期,但是它知道对象是否还活着 。如果对象还活着,那么它可以提升为有效的 shared_ptr; 如果对象已经销毁了,提升会失败,返回一个空的 shared_ptr。

10.5.malloc 和  new的区别?

 

特征new/deletemalloc/free
分配内存的位置 自由存储区
内存分配失败返回值 完整类型指针 void*
内存分配失败返回值 默认抛出异常 返回NULL
分配内存的大小 由编译器根据类型计算得出 必须显式指定字节数
处理数组 有处理数组的new版本new[] 需要用户计算数组的大小后进行内存分配
已分配内存的扩充 无法直观地处理 使用realloc简单完成
是否相互调用 可以,看具体的operator new/delete实现 不可调用new
分配内存时内存不足 客户能够指定处理函数或重新制定分配器 无法通过用户代码进行处理
函数重载 允许 不允许
构造函数与析构函数 调用 不调用

 

posted @ 2019-06-13 22:41  Royzzzzz  阅读(142)  评论(0编辑  收藏  举报