找回密码
 注册
搜索
热搜: java php web
查看: 3043|回复: 2

[笔记]C++primer学习笔记(5)——new和delete表达式

[复制链接]
发表于 2009-1-25 18:28:59 | 显示全部楼层 |阅读模式
[笔记]C++primer学习笔记(5)——new和delete表达式
这两种表达式也可用于动态创建和释放单个对象。动态创建对象时,只需指定其数据类型,而不必为该对象命名。


动态创建对象的初始化
1.创建动态对象时应当进行初始化。C++提供了直接初始化语法规则初始化动态创建的对象,可以用初始化变量的方法实现初始化。

例如:

int i(1024); // value of i is 1024
int *pi = new int(1024); // object to which pi points is 1024
string s(10, '9'); // value of s is "9999999999"
string *ps = new string(10, '9'); // *ps is "9999999999"

2.动态创建对象的默认初始化

对于类类型的对象,用该类的默认构造函数初始化,内置类型的则无初始化。

int *pi = new int; // pi points to an uninitialized int
int *pi = new int(); // pi points to an int value-initialized to 0

内置类型的可以这样进行初始化:

int *pi = new int(); // pi points to an int value-initialized to 0
cls *pc = new cls(); // pc points to a value-initialized object of type cls

注意:()在类型后面,初始化值为0。

3.撤销动态创建的对象

程序员必须有delete显式的将动态创建的对象所占用的内存返回给自由存储区。如果不是用new分配的内存区域,则用delete是不合法的。

零值指针的删除,用delete是合法的,但是没有实际意义。

int *ip = 0;
delete ip; // ok: always ok to delete a pointer that is equal to 0

执行语句:

delete p;

后,p变成没有定义,在很多机器上,尽管p没有定义,但是仍然存放了他所指向对象的地址,然而p所指向的内存已经被释放,因此不再有效。此时该指针变成了悬垂指针,悬垂指针往往导致程序错误,而且很难检测出来。因此,一旦删除了指针所指向的对象,立即将指针置位零。

const对象的动态分配和撤销
// allocate and initialize a const object
const int *pci = new const int(1024);

// allocate default initialized const empty string
const string *pcs = new const string;

动态内存的管理很容易出错
(1)内存泄露:删除动态内存失败称为内存泄露,内存泄露很难发现,一般需要应用程序运行一段时间后,耗尽了所有内存空间时,内存泄露才会显露出来。

(2)读写已删除的对象,这类错误比较容易检测。

(3)对同一个内存使用了两次delete表达式。当两个指针指向同一个动态创建的对象,山初始就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返回给自由存储区,然后接着delete第二个指针,此时自由存储区可能会被破坏。
发表于 2009-1-25 18:47:52 | 显示全部楼层
C++提供了两一种途径,即程序员有两种方式向操作系统申请内存的方式,一种是在栈上分配,内存的大小固定,一种是在堆上分配,申请的内存大小可以在运行时变化,大小不固定
回复

使用道具 举报

发表于 2009-1-25 20:15:08 | 显示全部楼层
非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|软晨网(RuanChen.com)

GMT+8, 2024-11-23 00:39

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表