c++中的new 和delete

new是用来动态申请内存空间的C++中的一个关键字。delete是用来删除new所申请空间对象的。

想深入理解new请看:http://blog.csdn.net/songthin/article/details/1703966

delete p和delete [] p的区别:

1、int* p = new int(20);

delete p;

2、int*p = new int[10]();//数组带初始化

delete [] p;

从上面两个小例子,可以看出delete p 用来删除单个元素,而delete [] p用来删除数组元素。注意:当删除数组元素时如果使用delete [] p 编译也会是正确的,但意思就不同了。

关于delete后的野指针:

如上1,2所示,当删除指针后,该指针变成悬垂指针(dangling pointer).悬垂指针指向曾经存放对象的内存,但该对象已经不存在了。  悬垂指针往往导致程序错我,而且一般很难检测出来。所以一旦删除了对象就立即将指针设置为0,例如 delete p; p = NULL;

下面是一个关于悬垂指针的列子:引用原文http://blog.sina.com.cn/s/blog_6405313801013jvg.html

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int *p = new int;
  6. *p = 3;
  7. cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<<endl;
  8. delete p;
  9. cout<<"删除空间后,指针p读取的值:"<<*p<<endl;
  10. long *p1 = new long;
  11. *p1 = 100;
  12. cout<<"p1的值:"<<*p1<<endl;
  13. cout<<"p的值:"<<*p<<endl;
  14. cout<<"创建新空间后,指针p中保存的地址:"<<p<<endl;
  15. cout<<"指向新空间的指针p1保存的地址:"<<p1<<endl;
  16. *p = 23;
  17. cout<<"将23赋给p的地址后,指针p读取的值;"<<*p<<endl;
  18. cout<<"将23赋给p的地址后,指针p1读取的值:"<<*p1<<endl;
  19. delete p1;
  20. return 0;
  21. }

运行结果:

以上代码可以看出,删除后的指针p和新建的指针p1指向的是同一块内存,出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。

欢迎赐教!

时间: 2024-12-16 15:11:50

c++中的new 和delete的相关文章

oracle 中删除表 drop delete truncate

oracle 中删除表 drop delete truncate 相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名(后面不跟where语句,则也删除表中所有的数据) truncate table 表名 区别 首先delete 属于DML,当不commit时时不生效的 而truncate 和 drop 则是直接生效的,不能回滚. truncate 和 delete 不删除表的结构,只是针对表中的内容删除 drop语句

Oracle中的Truncate和Delete语句

Oracle中的Truncate和Delete语句 首先讲一下,truncate命令: 语法:TRUNCATE  TABLE  table; 表格里的数据被清空,存储空间被释放. 运行后会自动提交,包括之前其它未提交的会话,因而一旦清空无法回退. 只有表格的创建者或者其他拥有删除任意表格权限的用户(如DBA)才能清空表格. TRUNCATE  TABLE  dept30; Table truncated. ---------------------------------------------

深入理解c++中的new与delete

一,new与delete的细节 假如有下面的代码: string *sp = new string("a value"); string *arr = new string[10]; 整个new的语句可以分为三步完成, 首先,编译器使用名为operator new(operator new[])的标准库函数,该函数的作用是分配一块足够大的.原始的空间.第二步,编译器运行相应的构造函数构造对象,第三步,编译器将得到的对象首地址返回. 当在程序中使用 type *p = new type(

[转]C++中关于new和delete的使用

转载的地址 近一直在啃 C++ Primer 中文版第4版,发现 C++中new和delete应用遍布全书,现对其使用作简单总结.在C++中,可以使用new和delete动态创建和释放数组或者单个对象,现在对它们的使用一一道来. 1.创建动态数组 数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道它的长度,数组只在定义它的块语句中存在.对于动态分配的数组,虽然长度是固定的,但是动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度:同时,动态分配的数组一直存

Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用. 开启Session Session实例由SessionFactory开启获得,例如: Configuration config = new Configuration().configure(); SessionFact

sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与delete区别. 我们先看一下truncate table的说明:删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE在功能上与没有WHERE子句的DELETE语句相同:但是,TRUNCATE TABLE速度更快,使用的系统资源和事务日志资源更少. truncate table的语

delphi中的copy,delete,pos和leftstr,RightStr的用法

copy 举个例子:str := “123456”;str1 := Copy(Str,2,3);结果就是 str1 等于 234.Copy有3个参数,第一个是你要处理的字符串,第二个是你要截取的开始位置,第3个是截取位数.当你的第3个参数大于字符长度,那么效果就是取 开始位置 后的所有字符.str1 := Copy(Str,2,10); 结果就是str1 等于 23456. leftstr和pos 假设字符串是 S := ’Delphi is the BEST’, 那么 LeftStr(S, 5

C++中的new与delete

C++中对象数组创建时,主要注意的点有:虚函数和带参数的构造函数,当出现虚函数时,对象数组中如通过父对象指向子对象,因为需要做Slice,析构时会造成指针错误引发内存泄露.测试程序如下: class A { private: int num; public: A(int a):num(a){} virtual ~A() {} virtual void g() {cout << "A::g()" << endl;} }; class B:virtual publi

Sql语句中的truncate,delete,drop的区别

相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 不同点: 1. truncate 和 delete 只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain).触发器(trigger).索引(index):依赖于该表的存储过程/函数将保留,但是变为 invalid 状态. 2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效:如果有相