`
7090
  • 浏览: 279485 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C/C++ 指针删除的几个细节

 
阅读更多
在C/C++中,当指针需要删除时,对于new的指针,调用delete就可以删除  比如
int* p = new int(17);
delete p;

有时候为了避免使用错误,一般在delete之后,将p置为NULL,即
int* p = new int(17);
delete p;
p = NULL;


有时候为了方便及统一处理指针的申请及释放,一般放到将删除操作放到一个方法中去做,
int* p = new int(17);
void deleteP(int* a){
    delete a;
    a = NULL;
}

但是这样对a赋值为NULL,对于调用的指针p来说,虽然p占用的内存被释放了,但是p这个指针还是指向delete之前的地址,即p != NULL ,所以某些通过根据 p是否为NULL进行判断而执行的操作就不对了,比如
if ( p != NULL)
{
   .....
} 

上面的做法就不对了

有一个方法可以解决,就是指针释放的时候,传递进去的不是指针,而是指针的引用,即
int* p = new int(17);
void deleteP(int*& a){
    delete a;
    a = NULL;
}

这样调用p就变为NULL了,上面的根据p是否为NULL进行的判断也就正确了

有时候这种操作也可以通过一个宏定义去完成,即
#define CC_SAFE_DELETE(p)	if(p) { delete (p); (p) = NULL; }

因为宏定义执行的时候,是到调用处进行展开,并不像方法那样做,所以通过宏定义进行删除后,调用指针p也就变成NULL了。

分享到:
评论

相关推荐

    学生管理系统(C/C++)

    学生管理系统的核心功能通常包括以下几个部分: 1. 学生信息管理:添加、删除、修改和查询学生的基本信息,如姓名、学号、班级等。这需要设计一个“学生”类来存储这些信息,并通过文件或数据库进行持久化存储。 2...

    C/C++安全检查工具预处理器的设计与实现

    标题“C/C++安全检查工具预处理器的设计与实现”意味着本文将介绍如何设计和构建一个专门用于C/C++语言的安全检查工具中的预处理器部分。预处理器是编译过程中的第一步,它负责处理源代码文件中的预处理指令,如宏...

    c/c++ STL api 文档

    C/C++ STL(Standard Template Library,标准模板库)是C++编程语言中不可或缺的一部分,它提供了...通过中文文档`C C++ API.chm`,你可以深入学习每个组件的使用方法、接口和实现细节,以便更好地应用在实际项目中。

    高质量C/C++编程指南

    8. **MALLOC/FREE与NEW/DELETE的区别**:探讨C语言的内存分配函数与C++的新建/删除操作符之间的差异。 9. **内存耗尽应对策略**:当系统内存耗尽时,提供几种可能的解决方案。 10. **MALLOC/FREE使用要点**:给出...

    Dijkstra算法求最短路径的C/C++的程序四

    接下来详细介绍几个关键函数: 1. **keep_min_heap**:调整最小堆,确保堆的性质(父节点的权值小于或等于子节点)。 2. **heap_insert**:向最小堆中插入新的元素。 3. **heap_extract_min**:从最小堆中删除并...

    list.zip_C/C++_

    从"list.c"这个文件名来看,我们可以推测代码可能涉及到以下几个C/C++的知识点: 1. **链表数据结构**:链表是一种基础但重要的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表可以是...

    C只有尾指针的循环队列(数据结构作业)

    根据提供的部分代码,我们可以看到如下几个函数的定义: 1. **初始化队列** (`QueueInit`): 初始化一个空的循环队列。 - 分配内存给队列的尾指针。 - 尾指针指向自身,表示队列为空。 2. **插入元素到队列** (`...

    c语言c++课程设计_通讯录

    【标题】:“C语言C++课程设计_通讯录”是一个基于C语言和C++的编程实践项目,旨在帮助学生深入理解和应用这两种编程语言的基本概念和技术。这个课程设计的重点是实现一个通讯录系统,该系统能够存储联系人的基本...

    c,c++面试试题,经典,函数

    根据给定的文件标题、描述、标签以及部分内容,本文将围绕C/C++语言中的几个典型面试题目进行解析,包括但不限于虚拟函数的概念、字符串操作、内存管理、宏定义的行为以及常量指针的理解等方面。 ### 1. 虚拟函数...

    C++本科作业--模拟动物园

    项目的实现可能涉及到以下几个关键知识点: 1. **继承与多态性**:通过类的继承实现各种动物类,利用多态性允许不同的动物以统一的方式处理(如展示、喂食)。 2. **封装**:隐藏类的内部实现细节,只暴露必要的...

    【数据结构课程设计】航空订票系统(含源代码)

    C/C++提供了底层控制能力,适合处理数据结构的细节,例如内存管理、指针操作等。在VC6.0环境下,开发者可以体验到经典的集成开发环境和调试工具,有助于学习和优化代码性能。 四、课程设计流程 每个课程设计文档...

    新手学习C++入门资料

    C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。 C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C...

    mysql C++封装类

    在封装类的设计上,通常会包含以下几个关键部分: 1. **连接管理**:创建和销毁数据库连接。封装类可能会包含一个`connect`函数,用于输入数据库服务器地址、用户名、密码和数据库名等信息,建立连接。同时,还会有...

    C++ for quantitative finance

    C++ 提供了以下几个方面的优势: - **性能高**:C++ 编译后的代码运行速度非常快,适合高性能计算。 - **资源控制**:C++ 允许开发者直接操作内存,对资源有更精细的控制。 - **广泛的库支持**:C++ 拥有丰富的第三...

    c++编程 c++ 程序

    链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。 ##### 7.1 简单文本编辑器 这部分通过一个简单的文本编辑器案例,介绍了如何使用链表来实现文本编辑功能。 ##### ...

    21天学会C++教程电子书

    C++的学习分为几个关键部分:基础语法、面向对象编程、STL(标准模板库)和高级特性。这本教程可能涵盖了这些主题,让读者在21天内逐步建立起对C++的深入理解。 首先,基础语法是学习任何编程语言的起点,包括变量...

    C++程序设计习题与解答

    根据给定文件的信息,我们可以提炼出以下几个主要的知识点: ### C++程序设计基础 #### 1. C++语言概述 - **定义与历史**:C++是一种通用的、面向对象的编程语言,由Bjarne Stroustrup在1979年开始设计并实现。它...

    学习C++需要了解的十八个基础知识.docx

    学习C++语言,掌握以下几个关键知识点至关重要。首先,头文件在C++中起着至关重要的作用,它们提供了标准库的功能接口,允许我们调用库函数,而无需关注具体实现细节。在编写代码时,应避免将*和&修饰符与变量名隔开...

Global site tag (gtag.js) - Google Analytics