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,这样就非常清楚地表明指针不再指向任何对象。
转自:http://blog.csdn.net/hippig/article/details/8239573
C++中关于new和delete的使用的更多相关文章
- C++中的new与delete总结
1. operator new.operator delete与new.delete操作符的区别: operator new的作用类似于malloc,负责分配内存:operator delete的作用 ...
- Oracle中的Truncate和Delete语句
Oracle中的Truncate和Delete语句 首先讲一下,truncate命令: 语法:TRUNCATE TABLE table; 表格里的数据被清空,存储空间被释放. 运行后会自动 ...
- oracle 中删除表 drop delete truncate
oracle 中删除表 drop delete truncate 相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名 ...
- Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计 ...
- C++中的new与delete
C++中对象数组创建时,主要注意的点有:虚函数和带参数的构造函数,当出现虚函数时,对象数组中如通过父对象指向子对象,因为需要做Slice,析构时会造成指针错误引发内存泄露.测试程序如下: class ...
- sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)
我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...
- Javascript 中的 in, hasOwnProperty, delete, for/in
in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point ); //tru ...
- 含有自增序列的表中使用truncate与delete的不同结果
一个含有自增序列的表,使用delete跟truncate之后会有什么不同结果呢? 大概说一下,使用truncate,表中的记录全部被清除,如果向表中插入数据,那么数据的排序是从1开始的. 如果使用的是 ...
- ASP.NET MVC 学习8、Controller中的Detail和Delete方法
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and ...
- SharePoint 2010中列表Add和Delete事件解析
转:http://winsystem.ctocio.com.cn/26/11400026_2.shtml [IT专家网独家撰稿]SharePoint 2010与以前的版本相比,天翻地覆的变化并不为过. ...
随机推荐
- MySQL 环境搭建之解压方式安装
一 .MySQL服务 安装 1.下载: 地址: http://dev.mysql.com/downloads/mysql/ 2.安装: 将下载的mysql-5.7.16-winx64压缩包解压后的整 ...
- D - Game Prediction
Suppose there are M people, including you, playing a special card game. At the beginning, each playe ...
- python爬虫+使用cookie登录豆瓣
2017-10-09 19:06:22 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 先获得cookie,然后自动登录豆瓣和新浪微博 系统环境: 64位win10系统,同时装pytho ...
- Sqlite数据库管理(SQLite Developer) v4.0.0.528 中文版+破解方法(申明:来源于网络)
Sqlite数据库管理(SQLite Developer) v4.0.0.528 中文破解版 SharpPlus Sqlite Developer 特性: -强大的SQL编辑器 *Sqlite Sql ...
- Jumpserver堡垒机
堡垒机介绍 搭建简易堡垒机 安装步骤 wget --no-check-certificate https://olivier.sessink.nl/jailkit/jailkit-2.19.tar.b ...
- 文件下载报错:引发类型为“System.OutOfMemoryException”的异常-.Net 内存溢出
CSDN:http://blog.csdn.net/huwei2003/article/details/53559272 设置了也没有用,于是想到手动清理应用程序池,但又迁配置问题于是改成最后的方式! ...
- opencv中 int main(int argc,char* argv[])详解
opencv中 int main(int argc,char* argv[])详解 argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 ...
- 【每日一题】 UVA - 213 Message Decoding 模拟解码+读入函数+阅读题
题意:阅读理解难度一道比一道难orz.手摸了好久样例 题解: 读入:大循环用getline读入header顺便处理一下, 里面再写两重循环,外层一次读三个串,内层一次读num个串. 之后就查表,线性 ...
- hive优化之参数调优
1.hive参数优化之默认启用本地模式 启动hive本地模式参数,一般建议将其设置为true,即时刻启用: hive (chavin)> set hive.exec.mode.local.aut ...
- [skill] C与C++对于类型转换的验证
不多说了,代码说明一切. /home/tong/Src/copyleft/test [tong@T7] [:] > gcc .c /home/tong/Src/copyleft/test [to ...