标签:
一. 用new和delete创建和释放单个对象
动态创建对象时,只需要指定其数据类型, 而不必为该对象命名. new 表达式返回指向新创建对象的指针, 通过指针来访问此对象.
int *pi = new int;这个new表达式在自由存储区中分配创建了一个整型对象, 并返回此对象的地址, 并用该地址初始化指针pi.
1.动态创建对象的初始化
动态创建的对象可用初始化变量的方式实现初始化.
int *pi = new int (1024) ;
string *ps = new string(10, ‘9‘);
2.动态创建对象的默认初始化
如果不提供显示初始化, 对于类类型的对象, 用该类的默认构造函数初始化;而内置类型的对象则无初始化.
string *ps = new string() ; string *ps= new string ;对于类类型, 例如上面的string类型, 两个语句是一样的, 都是初始化为空字符串.
而对于内置类型, 如
int *pi = new int; int *pi = new int();不初始化和提供显示初始化的结果有显著的差别.
第一个语句pi指向一个未初始化的int类型, 而第二个语句pi指向一个初始化为0的int类型.
3.耗尽内存
如果程序用完了所有可用的内存, new表达式就有可能失败. 如果new表达式无法获取想要的内存空间, 系统将抛出名为bad_alloc的异常.
4.撤销动态创建的对象
动态创建的对象用完后, 程序员必须显式地将该对象占用的内存返回给自由存储区. c++提供delete表达式释放指针所指向的地址空间.如果指针指向的不是用new分配的内存地址, 则在该指针上使用delete是不合法的.
delete pi;
5.在delete后,重设指针的值
执行语句 delete pi;后, pi编成了不确定的指针, 它仍然存放了它之前所指向对象的地址, 然而pi所指的内存已经被释放, 因此p不再有效.
删除指针后, 该指针变成悬挂指针. 悬挂指针指向曾经存放对象的内存, 但该对象已经不存在了. 悬挂指针往往导致程序错误, 而且很难检测出来.
一旦删除了指针所指向的对象, 立即将指针置为0, 这样就非常清楚地表明指针不再指向任何对象.
二. 创建动态数组
1.动态数组的定义
数组变量通过指定类型, 数组名和维数来定义. 而动态分配数组时, 只需指定类型和数组长度, 不必为数组对象命名, new表达式返回指向新分配数组的第一个元素的指针:
int *pia = new int[10];
此new表达式分配了一个含有10个int型元素的数组, 并返回指向该数组第一个元素的指针, 此返回值初始化了指针pia.
new表达式需要指定指针类型以及在括号中给出的数组维数, 该维数可以是任意的复杂表达式.
2.初始化动态分配的数组
类类型: 使用该类的默认构造函数初始化.
内置类型: 无初始化
string *psa = new string[10]; //一个含有10个空字符串的数组
int *pia= new int[10]; 含有10个未初始化int的数组
也可以使用跟在数组长度后面的一对空括号, 对数组元素做值初始化.
int *pia2 = new int[10] ();
上述表达式把数组元素都设置为0.
对于动态分配的数组, 其元素只能初始化为元素类型的默认值, 而不能像数组变量一样 , 用初始化列表为数组元素提供各不相同的初值.
4.允许动态分配空数组
char *cp = new char[0];
用new动态创建长度为0的数组时, new返回有效的非零指针. 该指针与new返回的其他指针不同, 不能进行解引用操作, 因为毕竟它没有指向任何元素.
5.动态空间的释放
delete [] pia;
该语句回收了pia所指向的数组, 把相应的内存返还给自由存储区. 记得要有[] , 否则会导致少释放了内存空间, 导致内存泄漏.
标签:
原文地址:http://blog.csdn.net/nizhannizhan/article/details/46442393