delete 指针
#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 指针的更多相关文章
- delete指针以后应赋值为NULL
delete p后,只是释放了指针中存放的地址中的内存空间.但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址. 例如: 对一个非空指针delete后,若没有将p赋为N ...
- C++在delete指针后要赋值为NULL
C++标准规定:delete空指针是合法的,没有副作用. 所以我们在Delete指针后赋值为NULL或0是个好习惯.对一个非空指针delete后,若没有赋NULL,若再次delete的话 有可能出现问 ...
- [转载]delete指针之后应该赋值NULL
首先,C++标准规定:delete空指针是合法的,没有副作用.但是,delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址. 问题来了,对一 ...
- 为什么delete指针后指针设为null(已解答)
int *p;/*........*/delete p; p=null; 看代码的过程中,有这么一个疑问.删除了指针p,指针p既是不存在,怎么还能设置指针p为null呢?为什么还要设置为null呢? ...
- delete指针以后应赋值为NULL——QT deletelater指针以后也同样要马上赋值为NULL
delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址 delete NULL编译器不会报错(因为delete空指针是合法的) 例: 对一个 ...
- delete指针
是释放指针所指向的内存,而不是删除指针本身
- 指针delete之后赋值为null
1.现象 经常看到有些代码在delete之后赋值为null 2.原因 C++标准规定:delete空指针是合法的,没有副作用. 所以我们在Delete指针后赋值为NULL或0是个好习惯.对一个非空指针 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
- C++基础知识(3)---new 和 delete
学过c语言的人都知道,c语言中动态分配内存空间使用的是库函数malloc,calloc,realloc以及free.而c++中所使用的是关键字new和delete.如 动态分配 new , 撤销内 ...
随机推荐
- Linux程序设计 读笔3 文件操作
一 linux文件结构 二 系统调用和设备驱动程序 三 库函数 四 底层文件访问 五 标准IO库 六 格式化输入输出 七 文件和目录的维护 八 扫描目录 九 错误处理 十
- DDD的"waiting until GDB gets ready"
运行DDD调试器时,出现卡死现象,看软件状态,发现"waiting until GDB gets ready",Google了这个问题,很多都是删除文件夹"~/.ddd& ...
- jQuery工具函数下
测试操作 1.判断是否为数组对象 $(function () { //判断是否为数组对象 var arr = [1,2,3,4]; alert($.isArray(arr));//true }); 2 ...
- YouComplete:vim自动补全插件
在github上下载插件,按照README.md安装 1,ubuntu安装 vim插件管理:vundle插件安装同样按照 README.md 操作 2,user guide General Usage ...
- c++中在一个类中定义另一个只有带参数构造函数的类的对象
c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过 #include<iostream> using namespace std; class A { public: ...
- Oracle EBS-SQL (PO-16):检查采购订单完成情况统计.sql
select e.FULL_NAME 采购员, sum(plla ...
- Elf 32
[CentOS]安装软件:/ld-linux.so.2: ELF interpreter解决 环境: [orangle@localhost Downloads]$ uname -m&&am ...
- 28 个 Unix/Linux 的命令行神器
28 个 Unix/Linux 的命令行神器 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些 ...
- extjs让按钮可用或者不可用
Ext.getCmp(‘按钮ID’).enable();//设置为可用Ext.getCmp(‘按钮ID’).disable();//设置为不可用
- 基于Andoird 4.2.2的同步框架源代码学习——同步提供端
Android同步框架 同步(synchronization)允许用户将远程数据下载到新的设备上,同时将设备上的帐户数据上传到远端.同步还保证用户能够看到最新的数据. 开发者自然可以通过自己的方式来设 ...