


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+中的动态内存与智能指针在C+中,我们通过new(在动态内存中为对象分配空间并初始化对象)和delete(销毁该对象,并释放内存)直接分配和释放动态内存。如下代码:1int *pi = new int;/pi 指向一个未初始化的int有些人有这样的疑问,指针一定要new吗?其实指针和new没有什么关系。这里的new在动态内存里为对象分配了内存空间,并返回了一个指向该对象的指针。new是申请堆空间,不new是在栈上分配内存,指针只要指向有效的内存空间就可以。比如:123int i;int *p = &i;p-i;/p可以直接使用了new直接初始化对象:12int *pi = new int(128);/pi指向值为128的对象string ps = new string(christian);/*ps 指向“christian”的字符串new分配const对象必须进行初始化,并且返回的执着是一个指向const对象的指针:1const int p = new const int(1024);/分配并初始化一个const int;当然new申请内存分配的时候也不是都会成功的,一旦一个程序用光了他的所有可用内存(虽然这种情况一般很少发生),new表达式就会失败。这时候会抛出bad_alloc异常。所以我们需要通过delete来释放占用的内存。在这里注意delete并不是要删除指针,而是释放指针所指的内存。1234567int i;int *pi = &i;string str = dwarves;double *pd = new double(33);delete str; / 错误:str不是一个指针delete pi; / 错误:pi指向一个局部变量delete pd; / 正确使用new和delete来管理动态内存常出的一些错误:1.忘记delete,即导致了“内存泄漏”,2.野指针。在对象已经被释放掉之后,指针会置为空。这时候我们再次使用,会产生使用非法内存的指针。不过如果我们需要保留指针,可以在delete以后将nullptr赋予指针,这样指针就不指向任何对象了,如下代码:1234auto p(new auto 42);auto q = p;delete p;p = nullptr;题外话:在测试这个问题的时候,我输出了下q的值发现还是42,并且没有报错,后来在delete p之后,我又给*p = 19;这个时候 p ,q的值在输出的时候都是19,也没有报错。这个代码其实根本就是错误的了,因为p,q已经没有有效的内存空间了。这里是释放了内存,但指针的值不变,指向的内存不会清0,指向的这片内存区域是待分配的,如果没有被其他数据覆盖的话,你就能幸运得输出这主要原因是你分配的内存小,没有继续分配,被占用的概率小所致。我用的xcode,换到VS下就正常报错了,是因为VS为了从编译器的角度上解决缓冲区溢出等问题,加上的这种功能,C+标准里面没有这么要求,所有xcode和gcc是不会检查的。所以在这里 建议大家写纯C+代码的时候用vs。3.重复delete,就会使自由空间遭到破坏如:123string ps1 = new string (one),ps2 = ps1;delete ps1;delete ps2;/ps2的内存已经被释放了虽然显示的管理内存在性能上有一定的优势,但是随着多线程程序的出现和广泛使用,内存管理不佳的的情况变得更严重。所以C+标准库中的智能指针很好的解决了这些问题。auto_ptr以对象的方式管理堆分配的内存,并在适当的时间(比如析构),释放内存。我们只需要将new操作返回的指针作为auto_ptr的初始值,而不需要调用delete:1auto_ptr (new int);但是auto_ptr在拷贝时会返回一个左值并且不能调用delete;所以在C+11中改用shared_ptr(允许多个指针指向一个对象),unique_ptr(“独占”所指向的对象)还有weak_ptr它是一种不控制所指对象生存期的智能指针,指向shared_ptr所管理的对像,在memory头文件中。当我们定义一个unique_ptr的时候,需要将其绑定到一个new返回的指针。只能有一个uniqu_ptr指向对象,也就是说它不能被拷贝,也不支持赋值。但是我们可以通过move来移动123456std:unique_ptr p1(new int(5);std:unique_ptr p2 = p1; / 编译会出错std:uni
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025租房合同样本范文
- 2025建筑工人劳务派遣合同模板
- 2025技术咨询合同书「正式版」
- 护理业务查房流程
- 临床护理常规
- 人教版小学一年级语文上册第一单元模拟试题
- 2025年药理知识试题
- 核聚变:人类终极能源的钥匙646mb
- 眶底骨折的临床护理
- 保安押运工作者爱岗敬业心得体会模版
- 浙江抽水蓄能电站引水系统土建工程实施性施工组织设计知名企业
- 2023年汽车设计习题库含答案
- 2023年安徽中烟阜阳卷烟厂招聘笔试参考题库附带答案详解
- 2021年教师结构化面试试题汇总
- 劳动教养心灵-劳动教育在小学《道德与法治》课程中的实践初探 论文
- 《硬件工程师手册(全)》
- 内部控制风险评估
- 2023届广东省六校联盟高三上学期第三次联考语文试题2
- 环境生态学试题及答案
- GB/T 9116-2010带颈平焊钢制管法兰
- GB/T 31974-2015钝化颗粒镁
评论
0/150
提交评论