1. 与C的区别
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
并且,C语言对内存的3个操作都是库函数,而C++中申请空间new及释放空间delete两者都为关键字。
2. new、delete操作内置类型
void Test() {
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]
3. new、和delete操作自定义类型
class Test {
public:
Test()
: _data(0) {
cout<<"Test():"<<this<<endl;
}
~Test() {
cout<<"~Test():"<<this<<endl;
}
private:
int _data;
};
void Test2() {
// 申请单个Test类型的空间
Test* p1 = (Test*)malloc(sizeof(Test));
free(p1);
// 申请10个Test类型的空间
Test* p2 = (Test*)malloc(sizoef(Test) * 10);
free(p2);
}
void Test2() {
// 申请单个Test类型的对象,进行1次构造函数初始化
Test* p1 = new Test;
delete p1;
// 申请10个Test类型的对象,并进行10次构造函数初始化
Test* p2 = new Test[10];
delete[] p2;
}
注意:在申请自定义类型的空间时,new会调用构造函数进行初始化工作,delete会调用析构函数进行资源清理再释放空间,而malloc与free不会。
那么调用顺序就是先进行空间申请,再在所申请好的空间上进行初始化工作。先进行析构进行资源清理,再去释放空间。
内置类型malloc与free,new与delete相差不大,在针对内置类型就没有构造函数与析构函数的定义。但是new进行申请空间时不需要进行强转即字节计算,有助于提高程序员的幸福感!
4. 对称使用
用new申请一定要delete进行释放,用new[]申请的一定要用delete[]进行释放,若是new申请用free释放,malloc申请delete释放的话就会导致出错。
比如:采用new申请用free进行释放时,因为free没有调用析构函数,导致资源清理工作没有进行,可能申请堆上的资源或者打开文件的操作,资源没有被清理,极有可能造成内存泄露。程序可能会崩溃,但也不是绝对会崩溃,可能会留有难以发现的隐患,是质量很低的代码。并且new、delete作为关键字,malloc、free作为函数,可能内部执行的逻辑都不一样,混作一团进行使用时肯定是极其错误的!
malloc-->free new-->delete new[]-->delete[]