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

转载的地址

  近一直在啃 C++ Primer 中文版第4版,发现 C++中new和delete应用遍布全书,现对其使用作简单总结。在C++中,可以使用new和delete动态创建和释放数组或者单个对象,现在对它们的使用一一道来。

1.创建动态数组

  数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道它的长度,数组只在定义它的块语句中存在。对于动态分配的数组,虽然长度是固定的,但是动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度;同时,动态分配的数组一直存在直到程序显示释放为止,这样,我们就可以自己决定数组的存在与否了。

  每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap).C++语言使用new和delete在自由存储区中分配存储空间。动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针:

  int *pia=new int[10];

  此new表达式分配了一个含有10个int型元素的数组,并返回指向该数组第一个元素的指针。在自由存储区创建的数组对象是没有名字的,程序员只能通过其地址间接地访问堆中的对象。

动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化;如果数组元素是内置类型,则无初始化:

  string *psa = new string[10];  // 调用string类的默认构造函数依次初始化数组中的每个元素。

  int *pis = new int[10];   //无初始化值

  可使用跟在数组长度后面的一对空圆括号,对数组元素作值初始化:

  int *pis = new int[10]();  //数组元素都设置为0

  之所以要动态分配数组,往往是由于编译时并不知道数组的长度。C++中允许动态分配空数组:

  size_t n = get_size();

  int *p = new int[n];

  for(int *q=p;q!=p+n;++q)

  『/*处理数组元素的相关代码*/』

  在上面的例子中,只有在程序运行时才能确定n的值。如果n的值为0,代码依然正确执行。C++中虽然不允许定义长度为0的数组变量,但是明确指出,调用new动态创建长度为0的数组是合法的。

  char *cp = new char[10];

  用new动态创建长度为0的数组时,new返回有效的非零指针,但不能进行解引用,因为它毕竟没有指向任何元素。

2. 动态创建单个对象

  动态创建对象时,只需指定其数据类型,不必为该对象命名,new表达式返回指向新创建对象的指针,我们通过该指针来访问此对象:

  int *pi = new int(1024);

  string *ps = new string(10, ‘9‘);

  在C++中使用直接初始化语法规则初始化动态创建的对象,上面的表达式就使用该语法规则初始化了动态创建的对象。对于类类型的对象,则使用该类类型的构造函数初始化对象。可对动态创建的对象做值初始化,如下所示:

  string *ps = new string();

  int *pi = new int();

  对于提供了默认构造函数的类类型,没有必要进行值初始化。如果没有显示初始化动态创建的对象,则对于类类型的对象,用该类的默认构造函数初始化,对于内置类型的对象则无初始化。

3. 动态空间的释放

  动态分配的内存最后必须进行释放。如果不需要动态创建的数组,我们必须显示地将其占用的存储空间返还给程序的自由存储区。C++中使用delete [ ]表达式释放指针所指向的数组空间:

  delete [ ] pis;

  该语句释放上面所创建的动态int型数组所占有的存储空间。在关键字delete和指针之间的[ ]告诉编译器该指针指向的是自由存储区中的数组,而并非单个对象。对于表达式

  delete pi;

  该命令释放了pi指向的int型对象所占用的内存空间。删除指针后,该指针变成悬垂指针(dangling pointer).悬垂指针指向曾今存放对象的内存但该对象已经不存在了。悬垂指针往往导致程序错误,而且很难检测出来。一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚地表明指针不再指向任何对象。

时间: 2024-10-22 14:22:17

[转]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(

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

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 用来删除单个元素

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 中,事务提交之后才生效:如果有相