21 野指针

分析下列程序,输出结果:不确定,未定义行为。

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
void test(void) {
	char *str=(char *)malloc(100);
	strcpy(str,"hello");
	free(str);
	if(str!=NULL) {
		strcpy(str,"world");
	}
	printf(str);
}

int main()
{
	test();
	return 0;
}

      指针释放存储空间后没有置为NULL,变成野指针。

分析:野指针,不能通过简单的NULL进行判断,delete或free只是释放了指针所指向的内存区域,并没有干掉指针本身,所以指针指向的是“垃圾”指针,所以free或者delete之后要把指针置为NULL。

    free(str)只是释放了str指针所指向的内存区域,并未修改指针本身的地址值,所以str!=NULL,但是str是一个野指针(野指针 指向一个已删除的对象或未申请访问受限内存区域的指针),访问内存区域是受限的。不过,本人在mac和linux平台上运行上述代码,虽然有警告,但是最终都输出了world。

  

    释放以后按照理论是不能访问的,如果这个时候访问并且往里面输入数据的话系统不能保证数据安全,会有可能会出现world 但不代表一直会出现world。

时间: 2024-10-23 19:18:00

21 野指针的相关文章

View野指针问题分析报告

[问题描述] 音乐组同事反馈了一个必现Native Crash问题,tombstone如下: pid: 5028, tid: 5028, name: com.miui.player >>> com.miui.player <<< signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 79801f28 r0 7ac59c98 r1 00000000 r2 bea7b174 r3 400fc1b8 r4 774c4c88

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

关于野指针、空指针

1 /* 2 1>僵尸对象:所占用内存已经被回收的对象,将是对象不能再使用 3 2>野指针:指向僵尸对象(不可用内存)的指针 4 3>空指针:没有指向任何东西的指针(存储的对象可以是nil,NULL,0) 5 * 给野指针发送消息会报错,给空指针发送消息不会报错 6 */ 7 8 #import <Foundation/Foundation.h> 9 #import "Person.h" 10 11 int main(){ 12 // 1 13 Perso

C语言指针2(空指针,野指针)

//最近,有朋友开玩笑问 int *p  *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一篇文章) //空指针---->>指向空(null)的指针就是空指针 //指针的其他用法,指针可以指向指针,指针可以进行+ - * /运算 /* 特别注意,各个编译器都不相同,这里有一种错误写法,如: int *p,int a=10,b=20; p=&b; *p = &a;    

野指针

参考:http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理详解 野指针: 一.申请了指针没有初始化,全局指针未初始化编译时无错误,运行会出错,局部指针编译时会报错--unintialized: 二.malloc申请的内存用free(ptr)释放后,ptr指向的是垃圾内存,或者new出来的对象delete之后,指针所指的对象释放掉了,指针还存在,但指向的是垃圾内存,对待这种错误,可以在释放掉后把指针置为NULL: 三.函数返回

野指针的学习

1.野指针     野指针是指向了"垃圾"内存的指着. 2.产生原因     (1)指针变量没有被初始化.任何指针变量刚刚被创建的时候,是不会自动变成NULL指针的,他的缺省值是随机的,这个时候指针是乱指的.所以指针变量在被创建的同时应该被初始化,让指针指向合法的内存.     (2)指针P被free或者delect之后,没有设置为NULL:当指着被free之后,其实就是释放了指针指向这块内存进行释放,也就是说指针依旧是指向这个地址,但是这个地址上面的东西不要了,并且系统也不会将这块内

野指针 空指针 通用指针

空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值.指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西.空指针用0表示,C语言保证这个值不会是任何对象的地址.给指针值赋零则使它不再指向任何有意义的东西.为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL.    程序里可以写 p = 0;     或者 p = NULL; 两种写法都把p置为空指针值.相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值.操作NULL也会导致不可预知的错误 我

关于空指针NULL、野指针、通用指针

http://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白null的含义了.假设 有语句 int a=10;那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000:那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10.现在定义:int *p:                 p=&a

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同