2. 堆上动态创建对象

在 C 语言中,如果动态在堆上申请内存存放数据需要使用 mallocfree 一系列函数。

C++ 语言建议使用 newdelete 关键字在堆上创建对象用于代替 C 语言的 malloc 系列函数来动态创建对象。

关键字 new 用来在堆上动态创建对象。使用 new 创建对象时先调用 malloc 函数申请内存,然后调用相应的构造函数来初始化对象。

关键字 delete 用来销毁在堆上创建的对象,使用 delete 销毁对象时先调用析构函数进行反向初始化,然后再调用 free 函数来销毁对象占用的内存。

new 创建对象的语法

// 创建单个对象
new 类名;  // 调用无参数的构造函数
new 类名(实参列表); // 根据重载规则调用有参数的构造函数

// 创建对象数组
new 类名[对象个数(整数)]
// 创建对象数组,并指定构造函数
new 类名[对象个数(整数)]{每个对象的初始化构造函数}

delete 销毁对象的语法

// 销毁单个对象
delete 对象地址
// 销毁对象数组
delete [] 对象地址

示例

此示例示意使用 newdelete 来动态申请单个对象和动态申请对象的数组。

// filename: new_delete.cpp
#include <iostream>

using namespace std;

class Square {
    public:
        Square(double l=1) {
            cout << "边长为" << l << "的正方形被创建!" << endl;
            length = l;
        }
        ~Square() {
            cout << "边长为" << length << "的正方形被销毁!" << endl;
        }
        double get_length(void) {
            return  length * 2;
        }
    private:
        double length;
};

int main(int argc, char * argv[]) {
    Square * ps = NULL;

    cout << "动态分配一个对象" << endl;
    ps = new Square(2);  // 创建一个 Square 对象
    cout << ps->get_length() << endl;
    delete ps;  // 销毁这个 Square 对象

    // 创建三个 Square 对象
    cout << "动态分配多个对象" << endl;
    ps = new Square[3]{Square(3), Square(4), Square(5)};
    for (int i = 0; i < 3; i++) {
        ps[i].get_length();
    }
    delete [] ps;
    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o new_delete new_delete.cpp
weimz@mzstudio:~$ ./new_delete 
动态分配一个对象
边长为2的正方形被创建!
4
边长为2的正方形被销毁!
动态分配多个对象
边长为3的正方形被创建!
边长为4的正方形被创建!
边长为5的正方形被创建!
边长为5的正方形被销毁!
边长为4的正方形被销毁!
边长为3的正方形被销毁!

实验

使用 new 动态创建 10 个整数类型的对象数组。使用后再使用 delete 进行销毁。