C++类与new和delete操作符

当我们需要为类对象动态分配存储空间时,我们应该使用 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 所指向的对象数组。