一、C语言中的malloc、calloc、realloc
- C语言中malloc是用来分配内存的。
malloc返回一个指向所分配空间的空指针,或者如果没有足够的内存空间就返回NULL,参数num是要开辟的字节数。
- calloc在内存中分配一个数组,并初始化为0。
calloc返回一个指向所开辟空间的指针,开辟不成功返回NULL参数num是元素的个数,size是各元素的字节数。
- relloc重新分配内存
判断当前指针是否有足够大的连续空间,如果有,扩大memblock指向的位置并返回memblock,如果空间不够按照size指定的大小重新分配空间,将原有的数据从头到尾拷贝到新的内存中,释放旧的内存同时返回新内存的地址。参数memblock是指向之前内存的指针,size是分配后新的字节数。
二、C++中的new和delete。
面向过程的C++在动态内存管理中所使用的new和delete与malloc和free的区别
1.new和delete都是操作符,malloc和free是库函数,所以new和delete可以重载。
2.new和delete在调用时会自动调用构造函数和析构函数进行初始化和清理。
#pragma once
#include <iostream>
using namespace std;
class Array
{
public:
Array(int size = 10)
:_size(size)
,_str(0)
{
cout<<"call constructor"<<endl;
if(size>0)
{
_str = new int[size];
}
}
~Array()
{
cout<<"called destructor"<<endl;
if(_str)
{
delete[] _str;
_str = 0;
_size = 0;
}
}
void Show()
{
cout<<"size = "<<_size<<endl;
cout<<"_str= "<<_str<<endl;
}
private:
int *_str;
int _size;//数组的大小
};
#include "new.h"
#include <stdio.h>
void Test()
{
printf("===========p1==========\n");
Array *p1 = (Array *)malloc(sizeof(Array));
printf("===========p2==========\n");
Array *p2 = new Array(20);
p2->Show();
printf("===========p3==========\n");
Array *p3 = new Array[10];
p3->Show();
free(p1);
delete p2;
delete []p3;
}
int main()
{
Test();
system("pause");
return 0;
}
p2使用new开辟大小为20的数组,调用一次构造函数一次析构函数;p3使用new开辟了10个大小为10的数组(不写数组大小默认为10)调用10次构造函数10次析构函数。
3.malloc库函数中有参数size故在使用时必须手动计算元素的大小,new则不用。malloc失败返回NULL,new失败会抛异常;malloc成功返回void * 类型,new成功返回自己对应类型的指针。
三、new/delete和new[]/delete[]
new实现内存的动态管理是用operator new重载实现的;其实最后开辟空间还是使用了malloc函数。
operator new[]中使用了operator new。此时注意count是84!
delete使用free释放空间。
用operator delete[]重载了delete[]。operator delete[]中使用operator delete。
new一次传的size是8,new[]的应该是8*10 = 80,但是却多开辟了4个字节的空间。这是因为delete[]p3时并没有给的delete传需要调用几次析构函数,析构函数显式定义时才会多开辟。
在new.h中增加内置类型int *p4和int *p5[]
#include "new.h"
#include <stdio.h>
void Test()
{
printf("===========p1==========\n");
Array *p1 = (Array *)malloc(sizeof(Array));
printf("===========p2==========\n");
Array *p2 = new Array(20);
p2->Show();
printf("===========p3==========\n");
Array *p3 = new Array[10];
p3->Show();
free(p1);
printf("===========p4==========\n");
int*p4 = new int;
delete p4;
printf("===========p5==========\n");
int *p5 = new int[10];
delete p5;
delete p2;
delete []p3;
}
int main()
{
Test();
system("pause");
return 0;
}
查看count的大小
内置类型没有显式定义析构函数故count还是4 * 10 = 40。
画图表示如下: