除了静态内存和栈内存,每个程序还拥有一个内存池(自由空间或堆)。程序用堆来存储动态分配的对象
动态内存的管理
通过new运算符来完成new:在动态内存中为对象分配空间,并返回一个指向该对象的指针
delete: 接受一个动态对象指针,销毁该对象,并释放与之关联的内存
当创建智能指针时,必须提供指针可以指向的类型
shared_ptr<string> p1; //可以指向string
shared_ptr<list<int>> p2; // 可以指向int的list
默认初始化的智能指针中保存着一个空指针
最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数
shared_ptr<int> p3 = make_shared<int>(42); // 指向一个值为42的int的shared_ptr // 指向一个值为‘9999999999’的string的shared_ptr shared_ptr<string> p4 = make_shared<string>(10,'9'); // 指向一个值默认初始化的int,值为 0 shared_ptr<int> p5 = make_shared<int>();
-
当进行拷贝或赋值操作时,每个shared_ptr都会记录有多少个其他的shared_ptr指向相同的对象
-
一旦一个shared_ptr的计数器变为0,它就会自动释放自己管理的对象
shared_ptr<int> p = make_shared<int>(42); // p4指向一个值为“999999”的string shared_ptr<string> p2 = make_shared<string>(6,'9'); // q指向一个动态分配的int auto q = make_shared<int>(42); // q指向的int只有一个引用者 auto p(q); // p和q指向相同的对象 q = r; // 给 q 赋值,另它指向另一个地址 // 递增 r 指向的对象的引用计数 // 递减 q 原来指向的对象的引用计数 // q 原来指向的对象已没有引用者,会自动释放
-
析构函数一般用来释放对象所分配的资源
用new分配const对象是合法的
传递给delete的值必须指向动态分配的内存,或是一个空内存
unique_ptr是作用域指针,超出作用域时,就会被销毁
- 最安全的分配和使用动态内存的方法是调用一个名为make_unique的标准库函数。
- 某个时刻,只能有一个unique_ptr指向一个给定的对象,当unique_ptr被销毁时,它所指向的对象也被销毁
- 不支持赋值
shared_ptr允许多个指针指向同一个对象,智能指针也是模板
- 最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数。使用此函数时,会在动态内存中分配一个对象并初始化它,返回指向该对象的shared_ptr