#include<iostream>
using namespace std;
class human
{
public:
human(){cout<<"构造";}
int can(){x=4; return x;}
private:
int x;
};
int main()
{
(1) human *p=new human;
(2)delete p;
(3)p=0;
(4)delete p;
(5)p=new human;
return 0;
}
第(2)释放了指针所指向的内存空间,第(4)将指针删除,为什么(5)还能使用这个指针,(4)不是已经把指针删除了吗?

new  delete不是字面意义上的新建和删除

new表示申请内存

delete表示释放内存(退还,归还给系统)

这是一对组合命令

() human *p=new human;  声明一个指针变量p,并分配空间
()delete p; 释放p,释放后,p原来指向的内存空间不再为本程序所用,但变量p还是有效的,可以用,如()
()p=; 给变量p赋值为0
()delete p; 这句有问题了,当p没有指向任何内存空间时,进行Delete操作有可能会出现系统异常
()p=new human; 这里再次申请一次内存空间,是允许的,p指向一个新的内存对象地址。
return ;
追问
书上写的,delete一个空指针是安全的。
我的意思就想问怎么删除指针,或者指针不能被删除?
回答
问怎么删除指针,或者指针不能被删除?

我希望您在问这个问题时,对”指针“这个词有清楚的认识!

我可以先问一下,您这里说的”指针“是什么意思呢?
追问
指针是保存地址的变量,我这里说的就是这个意思,我就是问怎么删除这个用来保存地址的变量
回答
声明一个变量后,这个变量其作用域所在生命期中,就会一直存在,只是你会不会再用它,由编程者确定。

int i;
for( i=0;i<100;i++ )
{
}
我们常用的循环变量,这个i,我们用过后,从来没有想过要不要去删除它。
为什么你想删除指针变量呢?
指针变量也只是一个普通变量,如果从数值角度而言,指针变量只不过是一个和int i中的i一样的一个存储整型数据的变量!因为地址值就是个无符号整数! 所以,不可能人工删除一个变量!变量的生存期,是由变量的类型和位置所决定的,由系统决定!
追问
懂了,我还想问一点,delete指针之后,要不要把指针赋为0啊?,书上写的要赋为0,但是他演示的程序最后又没有将指针赋0
回答
释放指针指向的空间地址后,最好是将指针变量值清为0,这样可以防止后续程序代码”误走到不该走的地方“,而出现程序BUG。还有一种情况是,我们一般写代码都会这样:(尤其在析构函数中)
写个简单例子
class test {
private:
char *p;
public:
test(){ p = 0;} //函数1
test( char *x) { p=new char [100] ; strcpy( p, x );} //函数2
~test(){ if ( p )
delete p ;
}
};
因为建立对象时,有可能调用函数1,也可能调用函数2,因此,在析构时,加上检查if(p)这样的检查,就可以防止重复释放造成的BUG 但我们一般程序,申请一个空间后,用过了delete 之后程序结束了,所以也可以不用将其赋值为0

delete 指针的更多相关文章

  1. delete指针以后应赋值为NULL

    delete p后,只是释放了指针中存放的地址中的内存空间.但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址. 例如: 对一个非空指针delete后,若没有将p赋为N ...

  2. C++在delete指针后要赋值为NULL

    C++标准规定:delete空指针是合法的,没有副作用. 所以我们在Delete指针后赋值为NULL或0是个好习惯.对一个非空指针delete后,若没有赋NULL,若再次delete的话 有可能出现问 ...

  3. [转载]delete指针之后应该赋值NULL

    首先,C++标准规定:delete空指针是合法的,没有副作用.但是,delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址. 问题来了,对一 ...

  4. 为什么delete指针后指针设为null(已解答)

    int *p;/*........*/delete p; p=null; 看代码的过程中,有这么一个疑问.删除了指针p,指针p既是不存在,怎么还能设置指针p为null呢?为什么还要设置为null呢? ...

  5. delete指针以后应赋值为NULL——QT deletelater指针以后也同样要马上赋值为NULL

    delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址 delete NULL编译器不会报错(因为delete空指针是合法的) 例: 对一个 ...

  6. delete指针

    是释放指针所指向的内存,而不是删除指针本身

  7. 指针delete之后赋值为null

    1.现象 经常看到有些代码在delete之后赋值为null 2.原因 C++标准规定:delete空指针是合法的,没有副作用. 所以我们在Delete指针后赋值为NULL或0是个好习惯.对一个非空指针 ...

  8. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  9. C++基础知识(3)---new 和 delete

    学过c语言的人都知道,c语言中动态分配内存空间使用的是库函数malloc,calloc,realloc以及free.而c++中所使用的是关键字new和delete.如 动态分配 new  ,  撤销内 ...

随机推荐

  1. K - Digital Roots(第二季水)

    Description The digital root of a positive integer is found by summing the digits of the integer. If ...

  2. linux中BASH_SOURCE[0]

    在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非常有用的.而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非 ...

  3. YouTube视频插入Markdown

    举个例之: 正常YouTube会生成一个<iframe>直接在HTML里面引用即可: <iframe width="420" height="315&q ...

  4. Wordpress主题中常用代码总结

    1. 在 Wordpress主题中显示最热文章的 PHP代码 <?php $result = $wpdb->get_results("SELECT comment_count,I ...

  5. VS2003转VS2010 fatal error C1189: #error

    我自己的mfc的demo要转换编译环境出现以下编译错误: VS2010编译错误:fatal error C1189: #error : This file requires _WIN32_WINNT ...

  6. C语言基础06

    函数: 一组特定功能的代码段,之所以使用函数,为了在文件多处需要同一段代码时可以多次重复利用,减少代码冗余. //函数的声明 返回值类型 函数名称 ( 数据类型 形参1,数据类型 ,形参2 ) ; / ...

  7. ViewPager+Fragment取消预加载(延迟加载)

    在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载V ...

  8. mfc subclasswindow attach setwindowlong使用区别

    1. CWnd::Attach BOOL Attach( HWND hWndNew ); 返回值:如果成功,则返回非零值:否则返回0. 参数: hWndNew 指定了Windows窗口的句柄. 说明: ...

  9. linux脚本之简单实例

    利用脚本计算10的阶乘 简单说明一下: #!/bin/bash说明该shell使用的bash shell程序.这一句不可少for i in `seq 1 10`还可以写成for i in 1 2 3 ...

  10. 灵活使用getconf命令来获取系统信息

    http://blog.chinaunix.net/uid-23105261-id-109513.html 灵活使用getconf命令来获取系统信息 我们时常需要查询系统相关的信息,比如页面大小,整数 ...