8.10 为对象动态分配内存

    同把一个简单变量创建在动态存储区一样,可以用new和delete为对象分配动态存储区,在复制构造函数一节中已经介绍了为类内的指针成员分配动态内存的相关范例,本节主要讨论如何为对象和对象数组动态分配内存。

    8.10.1 使用new和delete为单个对象分配/释放动态内存

    代码8.22演示了如何为单个对象分配动态内存。

    代码8.22 单个对象动态内存分配NewforObject


    <——————————————文件名:point.h————————————————-> 01 #include<iostream> 02 using namespace std; 03 class point 04 { 05 private://private数据成员列表 06 int x; 07 int y; 08 public: 09 point(int xp=0,int yp=0)//构造函数,带默认参数值 10 { 11 x=xp; 12 y=yp; 13 cout<<"构造函数被调用"<<endl; 14 } 15 ~point()//析构函数 16 { 17 cout<<"析构函数被调用"<<endl; 18 } 19 void print()//成员函数,类内部实现 20 { 21 cout<<"x:"<<x<<",y:"<<y<<endl; 22 } 23 }; <——————————-文件名:example822.cpp————————————————> 24 #include"point.h" 25 using namespace std; 26 int main() 27 { 28 //动态申请一块内存,存储point类对象,并将地址赋值给point型指针p 29 point*p=new point(4,5); 30 p->print();//使用指针加->调用成员函数 31 delete p;//释放动态申请的内存,防止内存泄露 32 p=NULL;//养成良好习惯,防止野指针 33 return 0; 34 }

    输出结果如下所示。


    构造函数被调用 x:4,y:5 析构函数被调用

    【代码解析】在代码8.22第28行,用new为对象分配动态内存,对象的构造函数被激活,这时,new先分配一个足够存放该类对象的存储区(大小为sizeof类的存储区),然后调用程序中指明的构造函数初始化该内存区域,并返回该对象的地址给指针p,在用delete释放该动态内存时,将激活对象所在类的析构函数。

    使用“delete p;”释放所申请的动态内存非但不会销毁指针p,p的值也不会更改,因此,在执行了delete操作后,及时将指针置为NULL,杜绝野指针的出现,是个很好的编程习惯。