C++动态内存分配
一、C语言中动态内存如何分配?
在C中,可以调用malloc/calloc/realloc函数向系统申请一块存储空间,使用结束用free函数释放空间,因为申请的空间均在堆上申请,需要手动释放,否则会出现内存泄漏。至于C中这些函数如何使用在此不多加赘述,请参见C中动态内存分配。
二、C++中的动态内存分配
C++中提供两种运算符new和delete,使用它们更方便实现内存空间的动态分配。若要为数组动态分配空间则用new[ ]和delete[ ]。其使用方法如下:
数据类型 * 指针变量=new 数据类型(说明需求空间大小的一个整数)
delete 指针变量
注:数据类型可以是任何数据类型,包括用户自定义类型 。
三、那么malloc/free和new/delete有什么区别和联系?
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
class A
{
public:
A(int a = 10)
:_a(a)
{
cout << "A(int a = 10)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
A *a1=new A;
delete a1;
system("pause");
return 0;
}
此程序中,new调用了构造函数,给a赋值。delete调用析构函数。
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
class A
{
public:
A(int a = 10)
:_a(a)
{
cout << "A(int a = 10)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
A*a1=(A*)malloc(sizeof(A));
free(a1);
system("pause");
return 0;
}
这段代码中用了malloc 和free来动态分配空间。只是开辟和回收空间,并没有调用构造/析构函数。并且没有给a赋值。
【malloc/free和new/delete的区别和联系?】
- 它们都是动态管理内存的⼊口。
- malloc/free是C/C++标准库的函数,new/delete是C++操作符。
- malloc/free只是动态分配内存空间/释放空间。⽽new/delete除了分配空间还会调⽤构造函数和析构函数进⾏初始化与清理(清理成员)。
- malloc/free需要⼿动计算类型⼤⼩且返回值会void*,new/delete可⾃⼰计算类型的⼤⼩,返回对应类型的指针。
5、malloc/free申请空间后得判空,而new/delete不用。
6、new/delete底层调用malloc/free。
四、标准库函数operator new和operator delete
C++的其他内存管理接口
void * operator new (size_t size); 其底层由malloc函数实现
void operator delete (void* p); 其底层由free_dbg函数实现
void * operator new [](size_t size); ——>operator new()——>malloc()
void operator delete[] (void* p); ——>operator delete()——>free_dbg()
五、定位new表达式
定位new表达式是在已分配的原始内存空间中调⽤构造函数初始化⼀个对象。
new (place_address) type
new (place_address) type(initializer-list)
place_address必须是⼀个指针,initializer-list是类型的初始化列表。
class A
{
public:
A(int a = 10)
:_a(a)
{
cout << "A(int a = 10)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
A*pa = (A*)malloc(10 * sizeof(A));
int i = 0;
for (i = 0; i < 10;i++)
{
new(pa + i)A(i);
}
for (i = 0; i < 10; i++)
{
pa[i].~A();
}
free(pa);
system("pause");
return 0;
}
new(pa + i)A(i)此句用在在for循环中不断调用构造函数,来初始化对象。
总结:在C++中动态内存分配,new和delete操作符的使用可以方便内存管理,在开辟和释放空间的功能基础上自带调用构造函数和析构函数功能。