VC++/MFC学习笔记(三)

 

本节参考文献: 《高质量C++编程指南》 林锐

 

内存分配的方式:

 

1、从静态存储区域分配。

      内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2、在栈上创建。

      在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3、从堆上分配,亦称动态内存分配。

      程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

 

 

 

 

静态和动态内存分配的两个主要区别是:

1、静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接的对它进行操作。

2、静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要作任何事情。相反,动态对象的分配与释放,必须由程序员显式地管理,相对来说比较容易出错,它通过new和delete两个表达式来完成。

 

常见的内存错误:

 

1、内存分配未成功,却使用了它。

2、内存分配虽然成功,但是尚未初始化就引用它。

3、内存分配成功并且已经初始化,但操作越过了内存的边界。

4、忘记了释放内存,造成内存泄露。

5、释放了内存却继续使用它。

 

常见内存错误应对措施:

1、用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。

2、不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

3、避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

4、动态内存的申请与释放必须配对,防止内存泄漏。

5、用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

 

 

数组和指针:

      数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

      指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

1、数组中的常量可以被修改,而指针中的常量不能被修改。编译器发现不了指针常量被修改的错误。

2、数组和指针被复制的时候都只能用strcpy,不能直接用=,比较时也不能用==,应该用strcmp。

3、数组在不作为函数参数传递的时候,它的内存容量为N+1;当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

指针的内存容量为4。这是一个指针变量的字节数,而不是内容的字节数。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

时间: 2024-11-02 21:35:16

VC++/MFC学习笔记(三)的相关文章

VC++/MFC学习笔记(五)

 ADO技术介绍ADO是Microsoft最新和最强大的数据访问接口OLE DB而设计的,是一个便于使用的应用程序层.OLE DB为任何数据源都提供了高性能的访问,这些数据源包括关系和非关系数据库.电子邮件.文件系统.文本和图形以及自定义业务对象等.ADO在关键的Internet方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量.高性能的接口.同时ADO使用与DAO相似的约定和特性,使得它更易于学习.这里先介绍一下ADO技术的历史和ADO访问数据源的特点,然

VC++/MFC学习笔记(六)

  总在很多地方看到COM的相关的东西,但是一直以来对COM的理解只是局限于知道它的全称:Component Object Model.为此,专门读了一下<COM技术内幕>的第一章,力求先对COM有一个初步的了解,随着学习的深入,肯定会进一步对COM进行研究.   COM是什么? COM是一个说明如何建立可动态互变组件的规范.它提供了为保证能够互操作,客户和组件应遵循的一些标准. COM规范就是一套为组件架构设置标准的文档.遵循COM规范编写的组件能够满足对组件构架的所有需求. COM组件是以

VC++/MFC学习笔记(二)

  1.从结构体到类 C++中的结构体是不同于C中的结构体的.在C语言中,结构体是不能有函数的,而C++中的结构体可以有函数,成为成员函数. 在C++语言中,结构体就是用struct声明的类.只是默认情况下,结构体的成员是公有的(public),而类的成员是私有的(private). 2.类与对象 类的实例和类的对象是一个概念.对象可以被销毁,而类不能被销毁. 3.构造函数 构造函数是和类同名的函数. 构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式.如果一个

kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1290191 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linux kvm虚拟机安装 h

VSTO学习笔记(三) 开发Office 2010 64位COM加载项

原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(Automation Executables) 2.Office加载项(COM or Excel Add-In) 3.Office文档代码或模板(Code Behind an Office Document or Template) 4.Office 智能标签(Smart Tags) 本次我们将学习使

Bootstrap3学习笔记(三)之表格_javascript技巧

在上篇文章给大家介绍了 BootStrap3学习笔记(一)之网格系统       Bootstrap3学习笔记(二)之排版 只需要在table标签上使用.table类,就可以使用bootstrap默认的表格样式 如果需要行背景有交替变化,可以这样设定: 复制代码 代码如下: <table class="table table-striped"> 如果需要边框,可以这样设定: 复制代码 代码如下: <table class="table table-borde

JavaScript学习笔记(三):JavaScript也有入口Main函数_javascript技巧

在C和Java中,都有一个程序的入口函数或方法,即main函数或main方法.而在JavaScript中,程序是从JS源文件的头部开始运行的.但是某种意义上,我们仍然可以虚构出一个main函数来作为程序的起点,这样一来不仅可以跟其他语言统一了,而且说不定你会对JS有更深的理解. 1. 实际的入口 当把一个JavaScript文件交给JS引擎执行时,JS引擎就是从上到下逐条执行每条语句的,直到执行完所有代码. 2. 作用域链.全局作用域和全局对象 我们知道,JS中的每个函数在执行时都会产生一个新的

DB2 UDB V8.1管理学习笔记(三)_DB2

正在看的db2教程是:DB2 UDB V8.1管理学习笔记(三).强制断开已有连接,停止实例并删除.  $ db2idrop -f instance_name 用于在UNIX下迁移实例. $ db2imigr instance_name 更新实例,用于实例获得一些新的产品选项或修订包的访问权. $ db2iupdt instance_name 获取当前所处的实例. $ db2 get instance 当更新实例级别或数据库级别的参数后,有些可以立即生效,有些需要重新启动实例才可生效.immed

Paint.Net学习笔记——三、窗体(下)

近1个月没有更新了,不能再懒了,继续更新PDN的学习笔记!本节将说明PDN中窗体的继承关系,实 现过程等. 如上图所示,在PDN中,所有窗体都继承自PdnBaseForm类,该类继承自Form类与ISnapManagerHost接 口,该接口定义了SnapManager的get方法,SnapManager是管理界面窗口"粘靠"效果的,该实现方法之 后文章中讲述. 现在快速地过一下各个窗体的作用及特点. BaseForm: 所有PDN里窗体的基类,主要提供常用窗体方法及注册.卸载热键.