无用单元和悬挂引用

1.无用单元:

指一块存储区(或资源),该存储区虽然是程序(或进程)的一部分,但是在程序中却不可再对其引用。

按照C++的规定,我们可以说,无用单元是程序中没有指针指向的某些资源;

例如:

1 void main()
2 {
3     char *p = new char[1000];//分配一个包含1000个字符的动态数组
4     char *q = new char[1000];//另一个动态内存
5     p = q;//将p和q进行一些操作的代码
6     /*p所指向的1000个字符的存储区会发生什么?此时,p和q指向相同的区域,没有指针指向之前p指向
7     的旧存储区!该存储区还在,仍然占用着空间。但是程序已经不能访问该区域*/
8 }

2.悬挂引用:

当两个指针同时指向一个地址时,通过一个指针删除了该地址的数据,另一个指针就产生了悬挂引用。

1 void main()
2 {
3     char *p;
4     char *q;
5     p = new char[1024];
6     q = p;
7     delete[]p;
8     p = 0;//现在q就是一个悬挂引用
9 }

无用单元控制再软件设计中时一个非常重要的问题,因为它会影响应用的整体性能。

即使是不太重要的应用程序,再持续运行一段时间未停止,内存泄露也会导致严重的问题。

随着越来越多的内存变成无用单元,应用程序(和整个系统)的性能逐渐降低,导致越来越多的虚拟内存分页活动。最终,由于分页文件被占满,

整个系统只能停止。

并非所有程序都可以随意暂停,如核电站控制程序,一旦暂停可能将导致灾难性的后果。

C++在何时产生无用单元:

1.从函数退出时,在函数内部创建的所有局部变量(包括对象)以及按值传递的所有参数都不可访问。

2.从块退出时,在块内部声明的所有局部变量(包括对象)都不可访问。

3.任何复杂表达式包含的临时变量,在不需要时必须全部予以销毁,否则它们将成为无用单元。

4.任何动态分配的对象,在不需要时必须由程序员显式地销毁。

 1 TPerson::TPerson(const char _birthData[])
 2     :birthData(_birthData),address(0)
 3 {}
 4
 5 char *strdup(const char* src)   //辅助函数
 6 {
 7     char *ptr = new char[strlen(src) + 1];
 8     strcpy(ptr, src);
 9     return ptr;
10 }
11
12 TPerson::TPerson(const char _theName[], const char _theAddress[], unsigned long _theSSN, const char _theBirthDate[])
13     :ssn(theSSN), birthDate(_theBirthDate)
14 {
15     name = (_theName ? strdup(theName) : 0);
16     address = (_theAddress ? strdup(_theAddress) : 0);
17 }

辅助函数为数据成员申请一个新的内存空间。

无用单元的收集:

不仅只是析构函数来回收内存,一般函数也要回收内存。

1.析构函数

1 TPerson::~TPerson()
2 {
3     delete[]name;
4     delete[]address;
5 }

2.成员函数

 1 void TPerson::SetName(const char newName[])
 2 {
 3     unsigned oldLength = name ? strlen(name) : 0;
 4     unsigned newLength = newName ? strlen(newName) : 0;
 5     if (oldLength < newLength)
 6     {
 7         delete[]name;     //无用单元收集
 8         name = (newName ? strdup(newName) : 0);
 9     }
10     else
11     {
12         if (newName) strcpy(name, newName);
13         else { delete[]name; name = 0; }
14     }
15 }

内嵌对象,在主对象即将被销毁时,调用内嵌对象的析构函数,所有可以防止内存泄露。

时间: 2024-08-03 14:45:34

无用单元和悬挂引用的相关文章

[Excel VBA]单元格区域引用方式的小结

在使用ExcelVBA进行编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作.所谓单元格区域,指的是单个的单元格.或者是由多个单元格组成的区域.或者是整行.整列等.下面,我们设定一些情形,以问答的形式对引用单元格区域的方式进行归纳. 问题一:在VBA代码中,如何引用当前工作表中的单个单元格(例如引用单元格C3)?回答:可以使用下面列举的任一方式对当前工作表中的单元格(C3)进行引用.(1) Range("C3")(2) [C3](3) Cells(3,

C++ 指针 引用 变量引用

变量引用: 引用的作用就是给变量起个别名,假如有一个变量a,想给它起个别名b,         可以这么写:int a;//定义a是整型变量.int &b=a;//声明b是a的引用. 上面就是b是a的引用,即b是a的别名.在上面“&”是引用声明符,并不代表地址.a和b占同一个地址空间和内存单元.声明b是a的引用,可以理解为:使变量b具有变量a的地址. 引用作为函数参数: C++之所以增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能. 函数参数传递的两种情况: 1.将变量名作为

8-3-无用单元收集-动态存储管理-第8章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第8章  动态存储管理 - 无用单元收集 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.GeneralizedList-H-T.c      

[从产品角度学excel 04]-单元格的“衣服”

忘记发这里了..补发一下 这是<从产品角度学EXCEL>系列——单元格篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 2 EXCEL里的树形结构 3 单元格的秘密(文本/数字篇) 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 抱歉之前因为有各种事情,一个多月没更新了,从今天开始恢复更新. 在前一章节里,我们通过对excel xml代码的阅读,发现在excel单元格里,文本

VBA学习笔记之单元格

'单元格对象在VBA中一个非常基础,同时也很重要的. '它的表达方式也是非常的多样化. '---------------------------------------------------- 'Range 对象 '代表某一单元格.某一行.某一列.某一选定区域(该区域可包含一个或若干连续单元格区域),或者某一三维区域. 'Range ("文本型装单元格地址") 'range的常见写法 Sub rng() Range("a1").Select '单元格 Range(

Excel教程(11) - 查找和引用函数

ADDRESS 用途:以文字形式返回对工作簿中某一单元格的引用.    语法: sheADDRESS(row_num,column_num,abs_num,a1,et_text) 参数:Row_num 是单元格引用中使用的行号:Column_num 是单元格引用中使用的列标:Abs_num 指明返回的引用类型(1 或省略为绝对引用,2 绝对行号.相对列标,3 相对行号.绝 对列标,4 是相对引用):A1 是一个逻辑值,它用来指明是以 A1 或 R1C1 返回引用样式.如果 A1 为 TRUE 或

Excel 单元格自定义格式技巧总结

第一部分 Excel 中的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等:高级是因为利用 Excel 单元格的自定义格式我们可以实现一些看起来非常神奇和有用的效果.下面我们就由浅入深的来介绍一下 Excel 单元格自定义格式的知识和技巧. 1."G/通用格式" 以常规的数字显示,相当于"分类"列表中的"常规"选项. 代码:G/通用格式.10 显示为 10:10.1 显

Excel 相对引用与绝对引用

  相对引用与绝对引用 相对引用与绝对引用的区别在于,当将公式复制到其它单元格时,公式中单元格或单元格区域的地址是否有变化. 相对引用在复制公式时地址跟着发生变化,而绝对引用不会发生变化!绝对引用的方法是在原来引用地址的列标和行号前加上"$".如原来相对引用第一行第一列的地址写为"A1",而绝对引用时应该写为"$A$1".混合引用指的是列标与行号中,有一个被加上绝对引用符号"$".如"$A1",则公式复制到

(转)JAVA内存模型

(原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多.一个开发Java的开发者,一旦了解了JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,有什么笔误来Email告知:[email protected],本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提到一些和内存相关的计算机语言的一些