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 corr