动态内存管理了解一下?

一、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。

画图表示如下:



猜你喜欢

转载自blog.csdn.net/jane_yao/article/details/79821497