`
891633093
  • 浏览: 48781 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

c语言中的内存管理--提高篇

阅读更多

1.编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
2.使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。
3.用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
4.注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。

5.指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。
char *p = “world”;     // 注意p指向常量字符串
p[0] = ‘X’;            // 编译器不能发现该错误
cout << p << endl;

6.注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针
char a[] = "hello world";
char *p  = a;
cout<< sizeof(a) << endl; // 12字节
cout<< sizeof(p) << endl; // 4字节

void Func(char a[100])
{
 cout<< sizeof(a) << endl; // 4字节而不是100字节
}

7.
void GetMemory(char *p, int num)
{
 p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
 char *str = NULL;
 GetMemory(str, 100); // str 仍然为 NULL 
 strcpy(str, "hello"); // 运行错误
}
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”

void GetMemory2(char **p, int num)
{
 *p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
 char *str = NULL;
 GetMemory2(&str, 100); // 注意参数是 &str,而不是str
 strcpy(str, "hello"); 
 cout<< str << endl;
 free(str); 
}
由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单
char *GetMemory3(int num)
{
 char *p = (char *)malloc(sizeof(char) * num);
 return p;
}
void Test3(void)
{
 char *str = NULL;
 str = GetMemory3(100); 
 strcpy(str, "hello");
 cout<< str << endl;
 free(str); 
}

8.(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。

9.“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防
10.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

 

分享到:
评论

相关推荐

    C语言课程设计报告--物业管理系统.docx

    C语言课程设计报告--物业管理系统全文共15页,当前为第1页。C语言课程设计报告--物业管理系统全文共15页,当前为第1页。 C语言课程设计报告--物业管理系统全文共15页,当前为第1页。 C语言课程设计报告--物业管理...

    C语言课程设计--职工信息管理系统

    C语言课程设计--职工信息管理系统 C语言课程设计--职工信息管理系统

    单片机C语言程序设计 K1-K4 控制LED移位(有源码)

    单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序设计 K1-K4 控制LED移位(有源码)单片机C语言程序...

    不错的练手C语言课程设计项目-成绩管理系统.rar

    不错的练手C语言课程设计项目--成绩管理系统 不错的练手C语言课程设计项目--成绩管理系统 不错的练手C语言课程设计项目--成绩管理系统 不错的练手C语言课程设计项目--成绩管理系统 不错的练手C语言课程设计项目--...

    不错的练手C语言课程设计项目-产品管理系统.rar

    不错的练手C语言课程设计项目--产品管理系统 不错的练手C语言课程设计项目--产品管理系统 不错的练手C语言课程设计项目--产品管理系统 不错的练手C语言课程设计项目--产品管理系统 不错的练手C语言课程设计项目--...

    单片机C语言程序设计K1-K4 控制LED移位(基于8051+Proteus仿真)

    单片机C语言程序设计K1-K4 控制LED移位(基于8051+Proteus仿真)单片机C语言程序设计K1-K4 控制LED移位(基于8051+Proteus仿真)单片机C语言程序设计K1-K4 控制LED移位(基于8051+Proteus仿真)单片机C语言程序设计...

    不错的c语言课程设计项目-产品入库管理操作系统.rar

    不错的c语言课程设计项目--产品入库管理操作系统 不错的c语言课程设计项目--产品入库管理操作系统 不错的c语言课程设计项目--产品入库管理操作系统 不错的c语言课程设计项目--产品入库管理操作系统 不错的c语言课程...

    不错的练手C语言课程设计项目-职工资源管理系统.rar

    不错的练手C语言课程设计项目--职工资源管理系统 不错的练手C语言课程设计项目--职工资源管理系统 不错的练手C语言课程设计项目--职工资源管理系统 不错的练手C语言课程设计项目--职工资源管理系统 不错的练手C语言...

    C语言07-睡眠-唤醒定时器唤醒(STC32G-DEMO-CODE-220311kw)

    C语言07-睡眠-唤醒定时器唤醒(STC32G-DEMO-CODE-220311kw)C语言07-睡眠-唤醒定时器唤醒(STC32G-DEMO-CODE-220311kw)C语言07-睡眠-唤醒定时器唤醒(STC32G-DEMO-CODE-220311kw)C语言07-睡眠-唤醒定时器唤醒(STC...

    C语言08-睡眠-外部中断唤醒(STC32G-DEMO-CODE-220311kw)

    C语言08-睡眠-外部中断唤醒(STC32G-DEMO-CODE-220311kw)C语言08-睡眠-外部中断唤醒(STC32G-DEMO-CODE-220311kw)C语言08-睡眠-外部中断唤醒(STC32G-DEMO-CODE-220311kw)C语言08-睡眠-外部中断唤醒(STC32G-DEMO...

    c语言毕业课程设计-产品管理系统源码分享,有需要的朋友拿走!~

    c语言毕业课程设计-产品管理系统源码分享,有需要的朋友拿走!~ c语言毕业课程设计-产品管理系统源码分享,有需要的朋友拿走!~ c语言毕业课程设计-产品管理系统源码分享,有需要的朋友拿走!~ c语言毕业课程设计-...

    不错的C语言课程设计项目-http服务器的实现.rar

    不错的C语言课程设计项目--http服务器的实现 不错的C语言课程设计项目--http服务器的实现 不错的C语言课程设计项目--http服务器的实现 不错的C语言课程设计项目--http服务器的实现 不错的C语言课程设计项目--http...

    不错的练手C语言课程设计项目-ktv歌曲系统.rar

    不错的练手C语言课程设计项目--ktv歌曲系统 不错的练手C语言课程设计项目--ktv歌曲系统 不错的练手C语言课程设计项目--ktv歌曲系统 不错的练手C语言课程设计项目--ktv歌曲系统 不错的练手C语言课程设计项目--ktv歌曲...

    C语言期末大作业-新型疫苗接种管理系统.zip

    C语言期末大作业-新型疫苗接种管理系统.zip 95分以上高分必过项目。 C语言期末大作业-新型疫苗接种管理系统.zip 95分以上高分必过项目。 C语言期末大作业-新型疫苗接种管理系统.zip 95分以上高分必过项目。 C语言...

    不错的C语言课程设计项目-http代理服务器的实现.rar

    不错的C语言课程设计项目--http代理服务器的实现 不错的C语言课程设计项目--http代理服务器的实现 不错的C语言课程设计项目--http代理服务器的实现 不错的C语言课程设计项目--http代理服务器的实现 不错的C语言课程...

    单片机C语言程序设计 IIC-24C04与数码管(有源码)

    单片机C语言程序设计 IIC-24C04与数码管(有源码)单片机C语言程序设计 IIC-24C04与数码管(有源码)单片机C语言程序设计 IIC-24C04与数码管(有源码)单片机C语言程序设计 IIC-24C04与数码管(有源码)单片机C语言程序...

    c语言----科研管理系统--源代码

    c语言----科研管理系统--源代码,适合初级C语言学习的朋友参考练习,对编写小程序有一定帮助,希望能对C语言爱好者有所帮助。

    数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf

    数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf...

    C语言------成绩管理系统源代码

    C语言------成绩管理系统源代码,适合初级C语言学习的朋友参考练习,对编写小程序有一定帮助,希望能对C语言爱好者有所帮助。

    C语言------歌曲信息管理源代码

    C语言------歌曲信息管理源代码,适合初级C语言学习的朋友参考练习,对编写小程序有一定帮助,希望能对C语言爱好者有所帮助。

Global site tag (gtag.js) - Google Analytics