C++ Primer 有感(new和delete表达式)
定义变量时,必须指定其数据类型和名字。而动态创建对象时,只需指定其数据类型,而不必为该对象命名。取而代之的是,new表达式返回指向性创建的指针。
1.动态创建对象的默认初始化
对于类类型的对象,用该类的默认构造函数初始化;而内置类型的对象则无初始化。
string *ps = new string; //initialized to empty string int *pi = new int; //pi points to an uninitialized int
对于内置类型或没有定义默认构造函数的类型,采用不同初始化方式则有显著的差别:
int *pi = new int; //pi points to an uninitialized int int *pi = new int( ); //pi points to an int value-initialized to 0
第一个语句的int型变量没有初始化,而第二个语句的int变量这被初始化为0.
2.如果new表达式无法获取需要的内存空间,系统将抛出名为bad_alloc的异常。
3.如果指针的值为0,则在其上做delete操作时合法的,但这样做没有任何意义:
int *ip = 0; delete ip;
C++保证:删除0值的指针式安全的。
4.删除指针后,该指针变成悬垂指针。悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来。