当函数结束时,函数体内的局部变量会自动销毁。 许多人错误地认为例子是正确的。原因
由于p是一个局部指针变量,当它消亡时,它指向的动态内存也会被销毁。 这是幻觉!
无效函数(无效)
字符 *p = (字符 *) (100); // 动态内存会自动释放吗?
示例尝试让动态内存自动释放
我们发现指针有一些“合理”的特征:
(1)指针的死亡并不意味着它所指向的内存会自动释放。
(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
成了“野指针”。 但奇怪的是,我运行这个程序却没有报错。 这可能和编译器有关。