`
ribishuangba
  • 浏览: 285501 次
文章分类
社区版块
存档分类
最新评论

指针部分释疑之二:内存的分配及内存错误类型(续)

 
阅读更多

4.常见的内存使用故障

内存泄露故障Memory Leak FaultsMLF是指在程序的某处申请了大小为X字节的空间方式程序结束时这X字节的空间全部或部分没有释放、多次释放都属于内存泄露故障。

MLF有三种形式:

(1) 遗漏故障:申请的内存没有释放;

(2) 不匹配故障:申请函数和释放函数不匹配;

(3) 不相等的释放:释放的空间和申请的空间大小不一样。

C++中,MLF有以下表现形式:

þ 第一类MLF:在程序中申请了内存,但没有去释放

void main()

{

int *p;

p = new int[20];

for(int i = 0;i < 20;i++)

cin>>*(p + i);

for(int i = 0;i< 20;i++)

cout<<p[i];

return;

}

在程序中为p申请了内存空间,但是使用完成后没有去释放,即第一类MLF

þ 第二类MLFp是用malloc分配的变量,若存在且只有一个free(p),那么p的使用是正确的。反之,如果存在两个或两个以上free(p),或者无free(p),或者存在一个或一个以上的delete p,则称为第二类MLF

int *p = (int *)malloc(10*sizeof(int));

......

delete []p;

þ 第三类MLFp是用new分配的变量,若存在且只有一个delete p;,那么p的使用是正确的。反之,如果存在两个或两个以上delete p,或者无delete p,或者存在一个或一个以上的free(p),则称为第三类MLF

int *p = new int[10];

......

free(p);

þ 第四类MLFp是用new[]分配的变量,若存在且只有一个delete[],则p的使用是正确的。反之,如果用deletefree释放,则是第四类MLF

class A{ }; p = new A[10];

......

delete p;

þ 第五类MLF:多余的deletefree是第五类MLF

char *p = “abc”;

......

free(p);

þ 第六类MLF:当申请内存的p发生变化后,用deletefree释放变化后的p是第六类MLF

char *p = new char[10];

......

++p;

......

delete []p;

þ 第七类MLF;如果在构造函数中有申请内存的操作,且在其他函数中出现对象的拷贝,如果无拷贝(复制)构造函数,则会产生析构函数对内存重复释放的错误。该类错误为第七类MLF

#include <iostream.h>

#include <string.h>

class Stu{

public:

Stu(char *n,int a) //构造函数

{

name = new char[10];

strcpy(name,n);

age = a;

}

void Show() //输出函数

{

cout<<"The studnet's name is:"<<name<<endl;

cout<<"The student's age is:"<<age<<endl;

}

~Stu( ) //析构函数

{

delete []name;

}

private:

char *name; //学生姓名

int age; //学生年龄

};

void main( )

{

Stu s1("John",20); //定义对象s1

s1.Show();

Stu s2(s1); //s1初始化对象s2

s2.Show();

}

上述程序在执行的时候会输出:

The studnet's name is:John

The student's age is:20

The studnet's name is:John

The student's age is:20

然后会弹出:“Debug Assertion Failed!”的错误对话框,原因就在于用对象s1初始化s2的时候系统调用了系统提供的默认拷贝构造函数,只是将s1的指针变量name的内容(即地址)传送给了s2的指针变量name,那么s1s2name指向的是同一个空间,在主函数执行结束后,系统先析构s2,这是就将s2的指针变量name指向的空间释放了,然后系统析构s1的时候就会出现重复释放同一空间的情况,这就是第七种MLF

对于上述问题,解决方法就是定义用户给出的拷贝构造函数:

Stu(const Stu &p)

{

if(!name)

delete []name;

name = new char[10];

strcpy(name,p.name);

age = p.age;

}

分享到:
评论

相关推荐

    指针的指针,引用,指针的引用,以及动态内存分配malloc讲解

    要理解malloc函数就必须理解指针的指针,引用,指针的引用,以及动态内存分配。 程序中的内存分为两种:栈内存和动态内存。 静态声明定义变量都是在栈内存中分配空间,在栈空间中会自动释放,而动态分配内存空间是...

    动态分配二维指针内存

    二维数组指针分配 形式有多种 可以指定一维 分配一维 也可以不指定都分配

    指针和内存分配详解

    深入的探讨了,指针和内存问题,很好的帮你解决指针和内存的各种疑惑

    VB 指针 内存分配

    分配内存 用法和C的malloc同理 别忘记释放内存

    C++程序内存分配讲解

    讲解目录 1、问:程序运行需要哪些空间?答:栈区、堆区、常量区等。 2、问:动态空间如何使用?答:通过指针 3、问:常量一定是在常量区吗?答:不一定 4、问:宏定义的常量是怎么...10、问:内存如何对齐?答:少对多

    关于程序设计的内存分配问题

    不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下。 此文章有2个用处, 1:这是个小论文,格式完整,大家...

    通过指针读写内存.e

    易语言通过指针读写内存 .版本 2 .子程序 _按钮_复制内存_被单击 .局部变量 地址, 整数型 .局部变量 缓冲区, 文本型 地址 = 写内存 () 缓冲区 = 取空白文本 (API_取文本长度 (地址) + 1) API_复制内存 (缓冲区...

    C++指针与动态分配 内存new关键字专题

    本文是学习C++的基础内容,指针是C或C++所特有的,因此应熟练掌握指针的使用,本文集中介绍C或C++中的各种指针,包括指针数组,数组指针,常量指针,指向指针的指针,尤其是对二维数组和指针进行了详细精辟的解释,...

    易语言防止程序退出内存错误

    易语言防止程序退出内存错误源码,防止程序退出内存错误,干进程,取得ID,强力打开进程,取字节集指针,取进程ID,ShowWindow,ZwQueryInformationProcess,ZwDuplicateObject,ZwQuerySystemInformation,ZwOpenProcess,...

    C++动态内存分配(new/new[]和delete/delete[])详解

    C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数需要计算...

    指针与内存分配PPT

    指针与内存分配PPT,介绍超级详细,看了就能懂,内含具体代码例子,极易上手。

    C指针系列之跨函数内存申请

    简单的C语言中使用指针在子函数内部申请内存并返回给主函数使用的范例。

    通过指针的指针传地址修改值的内存分析图

    通过指针的指针传地址修改值的内存分析图原件。 通过OmniGraffle Pro 在 mac os 10.8.4下编辑。 原文地址:http://blog.csdn.net/luanqunmo/article/details/9067865

    易语言内存指针模块

    易语言内存指针模块源码,内存指针模块,指针_取子程序地址,取当前参数个数,指针_取通用类型,指针_强制转换,指针_取变量指针,指针_取,指针_取变量数据地址,指针_到整数,指针_是否有效,数组_通用加入成员,数组_取数组...

    收集的内存管理内存分配资料

    内存 内存管理 内存分配 指针 数组 指针与数组...等等之间的详细介绍和比较

    指针是C语言可以用来直接访问内存地址

    3. 动态内存分配和释放 4. 结构体和链表操作 在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们可以通过这个指针来访问和操作这块...

    delphi内存分配完全总结

    delphi内存 内存分配 delphi内存的完全总结

    C++智能指针(含内存计数)

    C++智能指针(含内存计数) 完美解决内存泄漏问题。 使用智能指针就像使用指针自己一样方便

    C/C++指针引用及动态内存分配详细解析

    通过例子解析指针引用及动态内存分配觉得有用看好再下

    C++指针与动态分配内存new关键字专题

    C++指针与动态分配内存new关键字专题。网上收集,学习内存分配的好资料。

Global site tag (gtag.js) - Google Analytics