C语言:动态内存会自动释放吗? 消除“野指针”

 2024-02-22 03:01:15  阅读 0

当函数结束时,函数体内的局部变量会自动销毁。 许多人错误地认为例子是正确的。原因

由于p是一个局部指针变量,当它消亡时,它指向的动态内存也会被销毁。 这是幻觉!

无效函数(无效)

字符 *p = (字符 *) (100); // 动态内存会自动释放吗?

示例尝试让动态内存自动释放

我们发现指针有一些“合理”的特征:

(1)指针的死亡并不意味着它所指向的内存会自动释放。

c语言自动编号_自动编号用什么函数_c语言实现自动编号

(2)当内存被释放时,并不意味着指针就会消亡或者变成NULL指针。

由此可见,释放内存并不是一件可以掉以轻心的事情。可能有些人不服气,所以我们必须找出可以做什么

仓促行动的原因:

如果程序终止,所有指针都将消失,动态内存将被操作系统回收。 在这种情况下,

在程序死掉之前,不需要释放内存或者将指针设置为NULL。我终于可以偷懒了,而不是

会出问题吗?

想得很漂亮。 如果其他人取出该程序并在其他地方使用怎么办?

“野指针”不是NULL指针,而是指向“垃圾”内存的指针。 人们通常不会错误地使用 NULL

指针,因为使用if语句很容易判断。 但“野指针”非常危险,并且 if 语句对它们不起作用。

产生“野指针”的主要原因有两个:

(1)指针变量还没有被初始化。任何指针变量在第一次创建时都不会自动变成NULL指针。

默认值是随机的,会混乱。因此,指针变量应该在创建时初始化,或者

将指针设置为NULL或指向有效内存。例如

字符 *p = NULL;

字符 *str = (字符 *) (100);

(2)指针p被释放后并没有被设置为NULL,这使得人们误认为p是一个合法的指针。

(3)指针操作超出变量的范围。 这种情况是很难防范的。 示例程序如下:

A级

:

void Func(void){ 当cout Func()时,对象a已经消失,p指向a,所以p

成了“野指针”。 但奇怪的是,我运行这个程序却没有报错。 这可能和编译器有关。

标签: 指针 内存 变量

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码