|
[笔记]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第二个指针,此时自由存储区可能会被破坏。 |
|