发现生活之美

2.16 C++类与new和delete操作符

参考: http://www.weixueyuan.net/view/6347.html

总结:

  

当我们需要为类对象动态分配存储空间时,我们应该使用C++语言提供的new与new[]操作符,而不要使用C语言提供的malloc函数

虽然malloc函数具有分配存储空间的功能,但是这些函数除了分配存储空间外,不会调用类的构造函数。而C++语言提供的new和new[]操作符则不会如此,使用它们为对象分配存储空间的同时,它们也会调用相应的构造函数。

操作符delete和delete[]在释放对象存储空间的同时也会调用析构函数,而free函数则不会调用析构函数。

例1:

#include<iostream>
using namespace std;

class test
{
public:
    test(int i = 1){num = i;cout<<num<<" Constructor"<<endl;}
    ~test(){cout<<num<<" Destructor"<<endl;}
private:
    int num;
};

int main()
{
    test * t0 = new test(0);
    test * t1 = new test[5];
    test * t2 = (test *)malloc(sizeof(test));
    delete t0;
    delete[] t1;
    free(t2);
    return 0;
}

程序运行结果:

0 Constructor
1 Constructor
1 Constructor
1 Constructor
1 Constructor
1 Constructor
0 Destructor
1 Destructor
1 Destructor
1 Destructor
1 Destructor
1 Destructor

从程序运行结果不难看出malloc确实没有调用构造函数,free也没有调用析构函数。在这里可能有人会觉得这没有遵循析构函数调用顺序,其实不是这样的,因为我们在delete t0;的语句的时候就已经要求编译器销毁t0对象了,此时其它对象还处于存活期,因此t0先走一步,调用析构函数。之后再销毁t1所指向的对象数组。

 

posted on 2017-09-11 11:52  发现生活之美  阅读(230)  评论(0)    收藏  举报

导航