【C++】
动态内存管理:
C语言中:标准库的函数 malloc/free
void Test1()
{
int* p1 = (int*)malloc(sizeof(int) * 4);
free(p1);
p1 = NULL;
int* p2 = (int*)calloc(4, sizeof(int));
int* p3 = (int*)realloc(p2, sizeof(int) * 6);
//p2开辟的内存空间被修改为p3/p2已被释放
free(p3);
p3 = NULL;
}
C++中:c++操作符 new/delete
void Test2()
{
int* p1 = new int;//p1指向一个int型的空间/动态分配4个字节
int* p2 = new int(3);//初始化为3
int* p3 = new int[3];//开辟了3个int型空间/动态分配12个字节
delete p1;
delete p2;
delete[] p3;//匹配使用 防止内存泄漏
}
区别与联系:
- 都是动态内存管理的入口
- malloc/free 是C/C++标准库的函数,new/delete 是C++操作符
- malloc/free只是动态分配内存和释放空间,new/delete 还会调用构造/析构函数
- malloc/free使用时要自己计算空间大小,返回void*指针,使用指针时需自己强转;new会自己计算空间大小,返回相应的类型的指针
内存管理
深入了解new/delete & new[]/delete[]
- new 会调用operator new函数,还会调用构造函数进行初始化
- delete 会调用operator delete函数,调用析构函数进行释放
- new[]会调用operator new[]函数,会调用N次构造函数初始化
- delete[]调用operator delete[]函数,会调用N次析构函数
class Array
{
public:
Array(size_t size = 1)
:_a(0)
, _size(size)
{
cout << "Array" << endl;
if (_size > 0)
{
_a = new int[_size];
}
}
~Array()
{
cout << "~Array" << endl;
if (_a)
{
delete[] _a;
_a = 0;
_size = 0;
}
}
private:
int* _a;
size_t _size;
};
int main()
{
Array* p1 = new Array;
delete p1;
Array* p2 = new Array[2];
delete[] p2;
return 0;
}
void* operator new(size_t size) 这些函数并没有重载new和delete,我们不能对new/delete进行表达式重定义
- 这些函数也是通过使用molloc来开辟空间,通过free来释放空间