C++的堆内存管理 1、C++中专门管理堆内存的语句,而C语言中只能使用标准库的函数来管理堆内存。 new 分配内存,相当于C语言中的malloc delete 释放内存,相当于C语言中的free
2、new和delete的使用方法 类型* p = new 类型; // 分配一块内存 注意:new会自动计算字节数,且返回的是有类型的地址。 delete p; // 释放内存 类型* p = new 类型[n]; // 分配n块连续的内存 delete[] p; // 释放n块连续的内存 注意:new/delete 和new[]/delete[] 不能混用。
3、new/new[]分配内存时可以对内存进行初始化。 int* p = new int(12345); int* p = new int[5]{0,1,2,3,4}; // -std=gnu++11 大华 海康 同花顺 恒生电子 潮流 炎魂 涂鸦
4、new/delete不能与malloc/free混用 因为new和delete会自动调用结构、联合、类的构造和析构函数,而malloc不会,如果混用会造成析构和构造的不匹配,可能会引起段错误或内存泄露。 new[n] 会自动调用n次构造函数 delete[] 会自动调用n次析构函数,原因是C++编译器会在所申请到内存的前4个字节记录,内存块数。
5、new/delete的特殊情况 new分配内存失败时,不会返回空指针,而是产生std::bad_alloc异常。 delete 可以释放空地址,但不能重复释放同一块内存,否则会产生 double free or corruption的错误。
6、new/malloc的参数与返回值 new 需要的参数是类型,带类型的地址。 malloc 需要的参数是字节数,void*类型的地址。
C语言中的malloc/free与C++中的new和delete的相同点和不同点。
不同点:
身份:运算符/关键字 C标准库函数
返回值:带类型的地址 void*
参数:类型 字节数
失败:抛异常 返回NULL
构造/析构:自动调用 不调用
初始化:可以 不可以
头文件:不需要 stdlib.h
相同点:
都可以管理堆内存
返回值都是地址
都可以释放空指针
都不可以重复释放
|