内存相关内容

一、内存泄露memory leak

由于疏忽或错误造成程序未能释放已经不再使用内存的情况。即用完了动态申请的内存后没有归还,导致自己也无法使用申请的内存(地址弄丢),系统也不能再次将它分配给程序。一次内存泄露危害可以忽略,但是内存堆积后果很严重。

1.内存泄露可以分为四类:

常发性内存泄露:发生内存泄露的代码会被多次执行到,每次被执行的时候都会导致一块内存泄露。

偶发性内存泄露:发生内存泄露的代码只有在某些特定环境或操作过程下才会发生。对于特定的环境,偶发性的也许就变成了常发性的。

一次性内存泄露:发生内存泄露的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄露。比如构造函数中分配内存,析构函数中没有释放内存。

隐式内存泄露:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄露,因为最终程序释放了所有申请的内存,但是对于一个服务器程序,运行时间几天,不及时释放内存也可能导致最终耗尽系统的所有内存。

2.主要有两种类型的内存泄露

堆内存泄露(heap leak):对内存指的是程序运行中根据需要分配通过malloc、realloc、new等从堆中分配的一块内存,如果没有使用free和delete释放这块内存,那么这块内存将不会被使用,就会产生head leak。

系统资源泄露(resource leak):指程序使用系统分配的资源比如bitmap、handle、socket等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

二、内存溢出(out of memory)

程序要求分配的内存超出了系统能提供的,系统不能满足要求就会产生内存溢出。内存泄露最终会导致内存溢出。

常见的溢出问题主要有:

内存未分配成功却使用了它。解决方法是检查指针是否为NULL。若指针p是函数参数,在函数入口处用assert(p!=NULL)检查;若为动态申请内存,用if(p==NULL)进行防错处理。

内存虽然分配成功,没有初始化就使用(野指针)。

内存分配成功并初始化,但是操作越界。(for循环)

使用free和delete释放内存后,没有将指针设置为NULL,产生野指针。

三、内存对齐

1.同类的静态数据成员一样,对结构体时,如果结构体中有静态变量,那么一定要为它初始化,并且只能在结构体外初始化。

为什么在类外或者结构体外初始化?因为在没有实例化结构体时,并不为类或者结构体分配空间,所以只能在类外初始化。

为什么一定要对静态数据定义初始化?因为静态数据是属于整个类和结构体,和对象无关。如果不初始化,那么每次定义一个该类/结构体对象时,每个对象都有自己的一个静态数据成员,显然这是不对的。

2.1)运行结果中的char类型的乱码原因:程序把&ch当做一个字符串的首址。

<<运算符重载时,若参数为char*,cout就输出字符串。Ch是char,则&ch为char*,所以输出&ch的字符串。例如:

  

这里pc为char*,则输出pc时输出pc中存放的字符串。

如果想输出地址,可以在地址前加(void*)或者(int*)。

2)在为变量分配内存时,编译器会对内存进行优化,即不按照定义的先后顺序分配内存。

3)static在静态存储区存储,因此地址和之前的不连续。

4)结构体/类的大小不包含静态变量的大小。如左图,不管有没有去掉static,其sizeof都是20.

由于CPU一次读取若干个字节的内存数据,所以为方便存取,编译器可以指定结构体的对齐方式。

3.内存对齐的原因

由于CPU从内存中读取数据是以“块”为单位的,块长可为1,2,4,8等。为了减少读取次数,提高效率,那么就需要内存对齐。

内存对齐的规则

1)结构体中的第一个成员的首地址就是结构体变量的首地址;

2)结构体中的每个成员的首地址相对于结构体的首地址的偏移量是该成员数据类型大小的整数倍。

3)数据成员完成各自对齐之后,结构体本身也要对齐。结构体的总大小是对齐模数的整数倍。

注:对齐模数是#pragma pack(n)所指定的n和结构体中最大数据类型的成员大小的最小值。可以通过#pragma pack(n)来更改操作系统规定的对齐模数。

时间: 2024-11-05 18:58:48

内存相关内容的相关文章

EF Code First 配置的相关内容

I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 1 /// <summary> 2 /// 用户照片类 3 /// </summary> 4 public class PersonPhoto 5 { 6 [Key] 7 public int PersonId { get ; set ; } 8 public byte [] Photo { get ; set ; } 9 public string Caption { get ; set ; } // 标题

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个

Activity相关内容总结

/*---------------------------------------- *-描述--Activity相关内容总结. *-描述--S1.Activity的7个生命周期 * ☆☆☆☆☆单独活动生命周期: * 1.Activity创建的时候:onCreate() => onStart() => onResume() * 2.按下home键或进入其他活动(失去焦点):onPause() => onStop() * 3.再进入(重获取焦点):onRestart() => onS

(笔记)Linux内核中内存相关的操作函数

linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) 内核空间申请指定大小的内存区域,返回内核空间虚拟地址.在函数实现中,如果申请的内存空间较大的话,会从buddy系统申请若干内存页面,如果申请的内存空间大小较小的话,会从slab系统中申请内存空间.有关buddy和slab,请参见<linux内核之内存管理.doc> gfp_t flags 的选项

Web 前端性能优化相关内容解析

Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对照着去优化自己的网站或者相关项目.本文由Jeff 整理. 0.提高服务器的响应速度 砸钱的东西,但却最根本:搞好这一项,甚比下面任何一项. 1.优化样式表和脚本的排列顺序 正确地排列外部样式表与外部和内嵌脚本的顺序,可增加下载时同时加载的数据量,并提高浏览器显示网页的速度. 将样式表放在顶部,将脚本放在底部

Sql Server 内存相关计数器以及内存压力诊断

在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中,最理想的情况是Sql Server把所有所需的数据全部缓存到内存中,但是这往往也是不现实的,因为数据往往总是大于可用的物理内存 可以说内存是否存在压力能够直接决定数据库能否高效运行,同时,如果内存出现压力,同时也会影响到CPU的使用和存储性能,可以说是一损俱损,具有连带性. 那么,如何识别内存是否

位运算相关内容整理

位运算相关内容整理 1) 负数 负数的右移:负数右移的话,由于要保持它是负数,所以负数的二进制的左边补1.如果一直右移的话,最后就就变成0xFFFFFFFF 即-1 如: -4>>1 为-2 :-4>>2为-1 负数的左移:跟正整数左移一样,右边补0.左移总是在低位补零,高位丢失,因而负数左移后可能会变成正数. int x = 0x8fff0000; cout << (x << 1); // 输出为536739840 cout << (-2 &l

Web 前端性能优化相关内容解析[转]

Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对照着去优化自己的网站或者相关项目.本文由Jeff 整理. 0.提高服务器的响应速度 砸钱的东西,但却最根本:搞好这一项,甚比下面任何一项. 1.优化样式表和脚本的排列顺序 正确地排列外部样式表与外部和内嵌脚本的顺序,可增加下载时同时加载的数据量,并提高浏览器显示网页的速度. 将样式表放在顶部,将脚本放在底部

视频播放相关内容总结

视频播放相关内容总结 多媒体常识: 什么是多媒体 多媒体是计算机和视频技术的结合,实际上它是两个媒体:声音和图像,或者用现在的术语:音响和电视 常用的视频格式 Android系统默认:mp4.3gp 常用格式:ts.3gpp.3g2.3gpp2.avi.mkv.flv.divx.f4v.rm.rmvb.rv.wmv.asf.mov.mpg.v8.ram.mpeg. swf.m2v.asx.ra.ram.ndivx.xvid等 常用音频格式: Android系统:mp3.ogg: 常用格式:wma