使用delete删除指针(转)

p所指的空间。比如 int* p = new int(1);delete p;就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里。delete p会释放p所指向的内存。而这里p为一自动变量,其本身在程序退出其作用域时销毁。

用delete命令处理某个指针,说是把那个指针删除了是不正确的。

delete命令指示释放了那个指针原本所指的那部分内存而已。被delete后的指针p的值(地址值)并非就是NULL,而是随机值。

也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。

如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。

//p=NULL是个好习惯
    //就像你蹲完厕所要洗手一样

《问题》危险的代码:

int* p=new int(1);
   delete p;
   delete p;

探讨一:

连续两次对同一个指针delete ,会造成严重的错误。编译器会检测出这样的错误吗?或许一些编译器会的,但别太过指望编译器。

探讨二:

第一次delete后,p自动为空(NULL)了吗?不是的。

探讨三:

在delete之前会自动检查p是否为空(NULL),如果为空(NULL)就不再delete了吗?确实是如此。

探讨四:

删除为空(NULL)的指针是不会有任何问题的吗?确实是如此。

探讨五:

#define SAFE_DELETE(p) delete (p); p = 0;

这样就就万事大吉了吗?好像不是的。

delete p+1;//在C++中是正确的

SAFE_DELETE(p+1)将会导致错误

探讨六:

没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。

《结论》安全的代码:

int* p=new int(1);
   delete p;
   p = NULL;

(1)delete 一次以后,p成了野指针,它作为地址的值还是有效地没还可以访问它以前指向的内存,不过那片内存被重新格式化了;
(2)p不等于NULL,用 if(p) 语句不能判断它指向的内存是否有效(此时它指向的内存无效,p本身有效);
(3)delete 一次以后,不能再次delete,否则会报错;
(4)此时如果误用p指针,仍然可以修改内存的值和从该处取出数值,但此时数据不受保护,该内存空间可能被重新被分配给别的变量;
(5)如果p指向的空间再次被new函数分配,即使是分配给别的指针,即使分配大小与原来不一样,p又恢复了效力,可以改变内存的值,甚至可以重新被delete,p的作用与新分配的指针一样;

时间: 2024-11-12 07:51:45

使用delete删除指针(转)的相关文章

free 或delete后指针怎么样了

free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace std; int main(void) { char *p=(char *)malloc(100*sizeof(int)); strcpy(p,"Hello World"); cout<<"释放前指针p的地址:"<<&p<<end

CRUD操作 create创建 read读取 update修改 delete删除

1.注释语法:--,#2.后缀是.sql的文件是数据库查询文件3.保存查询4.在数据库里面 列有个名字叫字段 行有个名字叫记录 CRUD操作:create 创建(添加)read 读取update 修改delete 删除 1.添加数据insert into Info values('p009','张三',1,'n001','2016-8-30 12:9:8') ; 给特定的列添加数据insert into Info (code,name) values('p010','李四');自增长列的处理in

MYSQL中delete删除多表数据与删除关联数据

在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例. 1.delete from t1 where 条件 2.delete t1 from t1 where 条件 3.delete t1 from t1,t2 where 条件 4.delete t1,t2 from t1,t2 where 条件 前3者是可行的,第4者不可行. 也就是简单用delete语句无法进行多表删除数据操作,不过可以建立级联删除,

mysql delete删除记录数据库空间不减少问题解决方法

记得在中学时学计算机时老师就告诉我delete删除记录只是给数据库中的记录加一个删除标识了,这样数据库空间并不是减少了,当时没想这么多,昨天发现一个数据库利用delete 删除之后容量没变,后来百度了一下发现了下面一站长分享的文件,写得非常的不错,整理一下给各位参考. 今天空间商告诉我数据库空间满了,检查了一下,发现网站用户行为记录数据表竟然占了20多MB.积累了半年了,该删除释放一下空间了.果断delete之后发现数据库空间竟然没少,虽然数据记录数是零. 原来这是因为删除操作后在数据文件中留下

Oracle闪回查询恢复delete删除数据

Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback query(闪回查询)前提: SQL> show parameter undo; NAME                                TYPE       VALUE ------------------------------------ ----------- --------

free和delete把指针怎么啦?

别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉. 用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”.如果此时不把p设置为NULL,会让人误以为p是个合法的指针. 如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理.很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指

数据库CRUD操作:C:create创建(添加)、R:read读取、U:update:修改、D:delete删除

1.注释语法:--,#2.后缀是.sql的文件是数据库查询文件3.保存查询4.在数据库里面 列有个名字叫字段   行有个名字叫记录 CRUD操作:create 创建(添加)read 读取update 修改delete 删除 1.添加数据insert into Info values('p009','张三',1,'n001','2016-8-30 12:9:8') ; 给特定的列添加数据insert into Info (code,name) values('p010','李四');自增长列的处理

解决delete 删除sql语句,标识还保留删除之前的问题

我有一些数据,想要删除,首先想到的是delete,但是它会保留之前的标识,后来想用truncate来进行删除,但是,它会全部删除,并且不能加条件,只能回过头使用delete,以下是解决delete删除不保留之前的标识值delete from Emplyoee where EmplyoeeId between 19 and 31DBCC CHECKIDENT ('dbo.Emplyoee',reseed, 7)---标识从8开始 insert into Emplyoee values('cc','

SQLServer 恢复delete 删除的数据

恢复delete 删除的数据 一次偶然的机会我看到 恢复SQLSERVER被误删除的数据>博文 原文地址为:http://www.cnblogs.com/lyhabc/p/3683147.html 我就很好奇的看了下,然后就是一头雾水 ,完全看不懂 .其实我并没打算把 这篇博文看懂,既然别人已经开发好了 ,直接拿来用就行了. 后来我就随便测试了下 ,发现以下几个问题 1.博文中作者说 支持 datetime类型,测试的结果发现 完全不对,得到的日期是不正确的 2.该数据恢复方式不支持date类型