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