Skip to content

Latest commit

 

History

History
76 lines (49 loc) · 2.97 KB

动态内存.md

File metadata and controls

76 lines (49 loc) · 2.97 KB

动态内存

除了静态内存和栈内存,每个程序还拥有一个内存池(自由空间或堆)。程序用来存储动态分配的对象

动态内存的管理通过new运算符来完成

new:在动态内存中为对象分配空间,并返回一个指向该对象的指针

delete: 接受一个动态对象指针,销毁该对象,并释放与之关联的内存

shared_ptr: 允许多个指针指向同一个对象

  • 当创建智能指针时,必须提供指针可以指向的类型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指向相同的对象

  • 一旦一个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