码迷,mamicode.com
首页 > 编程语言 > 详细

c++ new 和 delete

时间:2015-06-10 17:31:20      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

一. 用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所指向的数组, 把相应的内存返还给自由存储区.  记得要有[] , 否则会导致少释放了内存空间, 导致内存泄漏.

     

     

c++ new 和 delete

标签:

原文地址:http://blog.csdn.net/nizhannizhan/article/details/46442393

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!