1. 分配再静态或栈内存中的对象由编译器自动创建销毁.
2.C++ 中动态内存的管理是通过
new: 前者为对象非配空间并返回一个指向该对象的指针.
delete: 接受一个动态对象的指针, 摧毁该对象, 并释放与之关联的内存.
智能指针: 负责自动释放所指对象, 都定义在 memory 头文件中
shared_ptr: 允许多个指针指向同一个对象
unique_ptr: 独占所指对象.
weak_ptr: 弱引用, 指向 shared_ptr 所指的对象.
3.make_shared 函数是最安全的分配和使用动态内存的方法.
使用例子:
auto p = make_shared<vector<string>>();
4. 每个 shared_ptr 都有一个关联的计数器, 称为引用计数. 拷贝, 函数传参, 函数值返回, 关联计数器都会递增. 当我们给这个 shared_ptr 赋予新值或是 shared_ptr 被销毁时, 计数器递减.
5. 构造函数控制初始化, 析构函数负责销毁该对象是进行什么操作.
6. 释放一块并非 new 分配的内存或者将相同的指针值释放多次, 行为未定义. 释放一个空指针是没有错误的.
7. 使用动态内存管理三个常见的问题:
. 忘记 delete 内存.
使用已经释放掉的对象. 通过在释放内存后将指针置为空, 有时可以检测褚这个问题.
同一块内存释放两次. 两个指针指向相同的动态内存空间. 对其中一个指针进行了 delete 后又对另一个进行 delete.
8. 我们不能将一个内置指针隐式的转换为一个智能指针, 一个返回 shared_ptr 的函数不能再其返回语句中隐式转换一个普通指针.
9. 当将一个 shared_ptr 绑定到一个普通指针时, 我们将内存的管理交给了这个 shared_ptr. 一旦这样做了, 我们就不应该再使用内置指针来访问 shared_ptr 所指的内存了.
10.get 用来将指针的访问权限传递给代码, 你只有再确定代码不会 delete 指针的情况下, 才能使用 get. 特别的是, 永远不要用 get 初始化另一个智能指针或者为另一个智能指针赋值.
11.release: 调用 release 会切断 unique_ptr 和它原来管理的对象间的联系. release 返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值.
12. 一般来说 unique_ptr 不能拷贝, 但是有一个例外: 我们可以拷贝或者赋值一个将要被销毁的 unique_ptr. 最常见的就是从函数返回一个 unique_ptr.
来源: http://www.bubuko.com/infodetail-2689298.html