迷途指针 new delete

简介: 编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针、失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的。而后,如果你没有重新赋值就试图再次使用该指针,引起的结果是不可预料的。

编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针、失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的。而后,如果你没有重新赋值就试图再次使用该指针,引起的结果是不可预料的。

 

空指针和迷途指针的区别?

当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在。这时它就是一个迷途指针。

当使用以下语句时,可以把迷途指针改为空指针:

myPtr=0;

通常,如果在删除一个指针后又把它删除一次,程序就会变得非常不稳定,任何情况都有可能发生。但是如果你只是删除了一个空指针,则什么事都不会发生,这样做非常安全。

使用迷途指针或空指针(如果myPtr=0)是非法的,而且有可能造成程序崩溃。如果指针是空指针,尽管同样是崩溃,但它同迷途指针的崩溃相比是一种可预料的崩溃。这样调试起来会方便得多。

 

例如,

 

#include<iostream>
#include<new>
using namespace std;

typedef unsigned short  int USHORT;

int main()
{
    USHORT *pInt=new USHORT;
    *pInt=10;
    cout<<*pInt<<endl;
    delete pInt;
    //pInt=0;
    long *pLong=new long;
    *pLong=90000;
    cout<<"*Plong: "<<*pLong<<endl;
    *pInt=20;
    cout<<"*pInt: "<<*pInt<<endl;
    cout<<"*pLong: "<<*pLong<<endl;
    delete pLong;
}

 

此时运行结果:

*pInt还是指向原来的内存,因此将pLong的数据修改了,但是结果是错误的而并没有保存。。

加入将pInt=0;这句加上,此时运行结果直接报错,因为pInt指向空指针,不能访问空指针。

 

C++中已经有了malloc/free,为什么还需要new/delete?

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任何强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理和释放内存工作的运算符delete。new/delete不是库函数,而是运算符。

 

相关文章
|
7月前
|
安全 编译器 C语言
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
44 1
|
7月前
|
消息中间件 Kubernetes NoSQL
野指针、malloc/new、free/delete
野指针、malloc/new、free/delete
野指针、malloc/new、free/delete
|
存储 C++
指针(二)- C++内存模型、动态分配内存new和delete
指针(二)- C++内存模型、动态分配内存new和delete
194 0
指针(二)- C++内存模型、动态分配内存new和delete
|
C++
C++:delete不完整类型的指针
简单版 以下代码编译时会有warning: class X; void foo(X* x) { delete x; } 在GCC4.1.2下,编译出错信息是: warning: possible problem detected in invocation of delete oper.
2398 0
|
C++
C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
   目  录 1       开始学习C++.............................................................................................................. 4 1.1       C++的头文件......................
1672 0
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
101 13
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
36 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
128 4