c++基础——动态内存
Posted konghuzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++基础——动态内存相关的知识,希望对你有一定的参考价值。
在我们的程序中,静态内存——用来保存局部 static 对象,类 static数据成员,以及定义在任何函数之外的变量。栈内存——用来保存定义在函数内的非 static 对象。分配在 静态内存 或 栈内存中的对象由编译器自动创建和销毁。对于栈内存,仅在其定义的程序块运行时才存在,static对象在使用之前分配,在程序结束时销毁。
除此之外,每个程序还拥有一个内存池,这部分内存被称为自由空间(堆),程序用堆来存储动态分配的对象,——即那些在程序运行时分配的对象。
1. 动态内存和智能指针
在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化;delete,接受一个动态指针,销毁该对象,并释放与之关联的内存。
新的标准提供了两种智能指针(smart pointer)类型来管理动态对象。shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。标准库还定义了一个名为weak_ptr的伴随类,指向shared_ptr所管理的对象。这三种类型都定义在memory中。
1.1 share_ptr 类
类似vector智能指针也是模板。
1 shared_ptr<string> p1; //shared_ptr,可以指向string 2 shared_ptr<list<int>> p2; //shared_ptr,可以指向int的list
智能指针的使用方法和普通指针类似,解引用返回它指向的对象,如果在一个条件判断中使用智能指针,效果就是检测它是否为空,
1 // 如果 p1 不为空,检查它是否指向一个空 string 2 if (p1 && p1->empty()) // p->mem -- (*p).mem 3 *p1 = "ds"
1.2 make_shared 函数
最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数。此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。与智能指针一样,make_shared也定义在memory中。
1 //指向一个值为42的int的shared_ptr 2 shared_ptr<int> p3 = make_shared<int>(42); 3 //p4指向一个值为”999999999”的string 4 shared_ptr<string> p4 = make_shared<string>(10,‘9‘); 5 //p5指向一个值初始化的int,即,值为0 6 shared_ptr<int> p5 = make_shared<int>();
7 auto p6 = make_share<vector<string>>();
1.3 share_ptr 的拷贝和赋值
当进行拷贝或赋值操作时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象:
1 auto p = make_shared<int>(42); //p指向的对象只有p一个引用者 2 auto q(p); //p和q指向相同对象,此对象有两个引用者
我们可以认为每个shared_ptr都有一个关联的计数器,通常称其为引用计数(reference count)。无论何时我们拷贝一个shared_ptr,计数器都会递增;当我们给shared_ptr赋予一个新值或是shared_ptr被销毁时,计算器就会递减。
一旦一个shared_ptr的计数器变为0,它就会自动释放自己所管理的对象:
1 auto r = make_shared<int>(42); //r指向的int只有一个引用者 2 r = q; //给r赋值,令它指向另一个地址 3 //递增q指向的对象的引用计数 4 //递减r原来指向对象的引用计数 5 //r原来指向的对象已没有引用者,会自动释放
以上是关于c++基础——动态内存的主要内容,如果未能解决你的问题,请参考以下文章