首先咱们先了解一下内存:
C语言使用malloc/free动态管理内存空间,C++引入了new/delete,new[]/delete[]来动态管理内存。数组
介绍new/delete,new[]/delete[]以前咱们先了解一下operator new,operator delete,operator new[],operator delete[]函数。函数
注:这些函数并无重载new/delete表达式。
最后,若是你们若是在自学遇到困难,想找一个C++的学习环境,能够加入咱们的C++学习圈,点击我加入吧,会节约不少时间,减小不少在学习中遇到的难题。学习
函数声明以下:spa
void* operator new(size_t size);指针
void operator delete(size_t size);对象
void* operator new[](size_t size);图片
void operator delete[](size_t size);内存
析:operator new/operator delete,operator new[]/operator delete[]是标准库函数,用法和malloc/free的用法同样,只负责分配/释放空间,但实际上operator new/operator delete只是malloc/free的一层封装。get
new/delete:动态管理对象;编译器
new[]/delete[]动态管理对象数组。
int* ptr1=new int;//动态分配4个字节的空间
delete ptr;
int* ptr2=new int(4);//动态内存分配4个字节空间并初始化
delete ptr2;
int* ptr3=new int[4];//动态内存分配16个字节空间
delete[];
1>,new/delete实际上作了什么事呢??
new:先调用operator new分配空间,再调用构造函数初始化空间。
delete:先调用析构函数清理对象,再调用operator delete释放空间。
2>,new[]/delete[]实际上作了什么事呢??
new[n]:调用operator new分配空间,再调用n次构造函数初始化对象。
delete[n]:调用n次析构函数清理对象,再调用operator delete释放空间。
为何编译器会知道调用多少次构造函数,析构函数呢?
原来在new[ ]分配空间的时候会在头部多分配4个字节来存n,这样在调用new[]/delete[]时就知道调用几回构造函数和析构函数了。
new/delete,new[]/delete[]为何要成对出现?
当new在开辟内置类型的空间时,不成对出现是能够的;可是当开辟非内置类型空间时,就要多开辟4个字节,这时若是不成对使用就会形成内存泄漏或者程序崩溃。
用宏模拟实现new[]/delete[]申请和释放数组
//DELETE_ARRAY参数中传n
do{
ptr=(type)operatornew(sizeof(type)n);
for (size_t i = 0; i <n;++i)
{
new(ptr+i)type;
}
} while (0);
do{
for (size_t i = 0; i < n; ++i)
{
(ptr+i)->~String();
}
operator delete ptr;
} while (0);
C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理
//给DELETE_ARRAY中不传n
do{
ptr = (type)operator new(sizeof(type)n + 4); //给n也分配空间
(int)ptr = n;
ptr=(type)((char)ptr+4);
for (size_t i = 0; i < n; ++i)
{
new(ptr + i)(type);
}
} while (0);
do{
size_t n = ((int)ptr - 1);
for (size_t i = 0; i < n; ++i)
{
(ptr + i)->~String();
}
operator delete(char*(ptr - 4));
} while (0);
malloc/free和new/delete之间关系和差别
C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理
关系:都能进行动态内存管理。
差别:1>,malloc/free是标准的库函数, new/delete是操做符;
2>,malloc/free只是分配/释放内存 ,new/delete不只分配/释放内存还调用构造函数初始化和析构函数清理;
3>,malloc/free手动计算类型大小,返回值void*,new/delete自动计算类型大小,返回对应类型的指针;
4>,malloc/free失败返回0, new/delete失败抛异常。