野指针
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错 (这里出错是隐含性的,若刚才指向的地址((char *) malloc(100))被保存了别的数据,那么,这是p就修改了这个值,造成程序混乱,意想不到的错误)
另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
1.new delete 是运算符,malloc,free是函数
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc /free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
2.new delete在实现上其实调用了malloc,free函数。
3.new operator除了分配内存,还要调用构造函数。
malloc函数只是负责分配内存。
另外注意,由于malloc和new都是在堆上分配的空间,无法自动释放,需要调用free/delete释放空间。malloc分配的空间用free释放,而new分配的空间用delete释放。
分享到:
相关推荐
### C野指针处理 #### 一、野指针的概念 野指针,是指向不可用内存区域的指针。这种指针的操作可能导致程序发生不可预知的错误,例如程序崩溃、数据损坏等严重后果。 #### 二、野指针与NULL指针的区别 野指针...
### NULL指针、零指针、野指针定义及区别 #### 一、空指针、NULL指针、零指针 ##### 1.1 什么是空指针常量 在计算机编程中,特别是C/C++语言中,空指针常量是指一系列表示“无指向”或“未指向任何有效地址”的值...
内存泄漏和野指针是C/C++编程中两个常见的错误,理解它们可以帮助程序员编写更高效、更稳定的程序。 **内存泄漏** 内存泄漏是指程序在动态分配内存后,未能正确地释放不再使用的内存区域。当一个内存块被分配但...
### 野指针问题详解 #### 一、引言 在C/C++编程语言中,指针是非常重要的数据类型之一,它可以实现灵活的数据操作和内存管理。然而,不当的指针使用也会导致程序中的错误,其中最常见的就是野指针问题。本文将详细...
### 野指针的意义与应用 #### 一、引言 在C语言中,指针是一种重要的数据类型,它能够存储内存地址,并通过该地址访问内存中的数据。然而,在使用指针的过程中,很容易遇到一种特殊情况——野指针。野指针是指向不...
在C语言编程中,野指针和内存操作是两个非常重要的概念,特别是在处理程序的运行时行为和资源管理时。野指针是指未初始化或已失效的指针,而内存操作则涵盖了动态内存分配、释放以及对内存块的读写等操作。本课程将...
杜绝野指针.docx杜绝野指针.docx
82.野指针
C程序中可怕的野指针图文详解 本文主要介绍了C程序中可怕的野指针的相关知识点,通过实例代码和详细的解释,帮助读者了解野指针的危险性和避免方法。 一、疑问点:指针是C语言一个很强大的功能,同时也是很容易让...
C++ 野指针的原理以及避免方法 C++ 野指针是指向非法的内存地址的指针,也称为悬挂指针(Dangling Pointer),是无法正常使用的指针。在 C++ 编程中,野指针是常见的错误之一,它们可以导致程序崩溃、内存泄露、...
一、指向没有访问权限的内存 二、指向释放掉的内存 三、规避野指针
如果尝试访问或再次释放已经释放的内存,就会导致未定义的行为,这通常被称为“悬空指针”或“野指针”。 野指针是指那些不再指向有效内存地址的指针。在释放内存后,如果不将指针设置为`NULL`,那么该指针就成为野...
C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。
智能指针可以解决普通指针存在的悬垂指针、野指针、资源泄露等问题本教程的主要的演示平台为Qt 4.11和g++ 7.4。学员也可以使用Visual Studio 2017。教程中从最简单的例子入手,覆盖智能指针的常用技术点,并穿插实例...
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。...
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。...
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。...
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。...