C++表达式new与delete知识详解

2020-01-06 15:13:48王冬梅
这篇文章主要为大家详细介绍了C++表达式new与delete知识点,学习如何动态创建对象,动态创建的对象与一般对象的区别,动态创建的对象的初始化以及释放动态分配的内存等知识点,感兴趣的朋友可以参考一下  

在C++中,new表达式用于动态创建对象,即在堆(自由存储区)空间上为对象分配内存,而程序员也要小心的使用这些申请来的内存空间,当不再使用时应该调用delete表达式来释放该存储空间并且将指针置零。 本文学习了如何动态创建对象,动态创建的对象与一般对象的区别,动态创建的对象的初始化以及释放动态分配的内存等知识点。

C++中分配的内存大致有三类:静态存储区,栈内存和堆内存

其中,静态存储区是在程序编译阶段就已经分配好的,用于全局变量,static变量等;堆栈是比较常用的对象存储方式。

new和delete是C++中程序员申请和撤销堆内存的唯一方式(据我所知)。

1. 创建对象

无论是定义内置类型变量还是类类型变量,都必须指定其对应的数据类型和名字。

动态创建对象只需指定其数据类型,而不必为该对象命名。

也就是说,变量定义得到的对象可以通过额外定义的指针或其对象名本身来访问,而动态创建方式得到的对象只能通过返回的指针来访问,因为该对象并没有名字。

2. 初始化

a. 可以在变量定义或是动态创建的阶段初始化对象,例如:


int i(222); // definition, initialized
int *pi = new int(222) // dynamically, initialized

b. 在这还要说一说变量定义时的默认初始化问题:

内置类型的变量初始化与其定义位置有关:函数外的自动初始化为零,而函数内的没有初始化。对于类类型的变量,程序总是会调用默认构造函数来初始化,这个默认构造函数可以是系统自动生成的,也可以是程序员定义的。如果没有默认构造函数,那么该类型变量的定义也就不能采用默认初始化方式,必须提供显式的初始化式。

动态创建的对象默认初始化与函数内变量定义的初始化方式相同,例如:


string *ps = new string; // initialized to empty string
int *pi = new int; // pi points to an uninitialized int