c++程序内存区域划分

目录

内存区域划分 

例题:

 malloc,calloc和realloc的区别

new和delete

 申请空间并初始化

申请多个空间:

new和delete对于自定义类型的处理:

 new和delete一定要匹配

new和malloc以及delete和free的区别

 抛异常的使用方法:

 new的底层


内存区域划分 

c++程序内存区域划分_第1张图片

 c++程序内存区域划分_第2张图片

注意:我们编写的代码是存在于计算机文件当中的,计算机文件属于硬盘而不属于内存,所以代码并不属于以上的内存划分 

例题:

c++程序内存区域划分_第3张图片

 

c++程序内存区域划分_第4张图片

我们对char2和*char2以及pChar3和*pChar3进行理解:

 c++程序内存区域划分_第5张图片

char2的字符串是经过静态区的"abcd"进行拷贝拷贝到栈上去。

pChar3因为被const修饰,所以对应的字符串在常量区,pChar3指向该区域。

char2和pChar3都是在栈上创建的指针,属于栈。

*char2表示数组首元素,也就是'a'

*pChar3表示指向常量区的常量字符串"abcd"的地址。

 malloc,calloc和realloc的区别

malloc表示申请空间,calloc表示申请空间并且初始化,而realloc表示扩容或缩容。 

这里不需要对ptr2进行释放:

答:在使用realloc时,会分为原地扩容或异地扩容,原地扩容之后ptr3就是原来的ptr2,异地扩容时,realloc函数还会将ptr2指向的空间进行释放。

new和delete

new和delete类比c语言的malloc和free,起到申请空间和释放空间的作用。

int main()
{
	int*p = new int;
	delete p;
}

申请一个整型的空间,p指针指向该空间。

delete表示释放该空间。

c++程序内存区域划分_第6张图片

我们在new的时候,并不会对该空间进行初始化。

 申请空间并初始化

int main()
{
	int*p = new int(0);
	delete p;
	return 0;
}

表示申请空间并把该空间对应的值初始化为0.

c++程序内存区域划分_第7张图片

申请多个空间:

	int*p1 = new int[10];
	delete[] p1;

申请多个空间并且初始化:

int*p1 = new int[10]{1, 2, 3, 4};
	delete[] p1;

new和delete对于内置类型的处理,和malloc,free没有什么区别。

new和delete对于自定义类型的处理:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};
class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A()" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};
int main()
{
	/*int*p = new int(0);
	delete p;*/
	/*int* p1 = new int[10]{1,2,3,4,5,6,7,8,9,10};
	delete[] p1;*/
	A*p1 = new A;
	delete p1;
	return 0;
}

对于自定义类型,new可以调用其默认构造,delete可以调用其默认析构。

 new和delete一定要匹配

错配可能产生我问题。

new和malloc以及delete和free的区别

int main()
{
	while (1)
	{
		int*p1 = (int*)malloc(1024);
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}

c++程序内存区域划分_第8张图片

malloc不断的申请内存,最终会申请失败,申请成功时返回该指针,申请失败时返回空指针。

 当我们使用new来进行替代时:

int main()
{
	while (1)
	{
		int*p1 = new int[102400];
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}

我们发现:new成功时返回该指针,new失败时不返回空指针。

 总结:malloc申请成功,返回该指针,申请失败,返回空指针。

new申请成功,返回该指针,申请失败,抛异常。

 

int main()
{
	try{

		while (1)
		{
			int*p1 = new int[102400];
			if (p1)
			{
				cout << p1 << endl;
			}
			else
			{
				cout << "申请失败" << endl;
				break;
			}
		}
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
	return 0;
}

c++程序内存区域划分_第9张图片

 抛异常的使用方法:

void test()
{
	while (1)
	{
		int*p1 = new int[102400];
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}
int main()
{
	try{
		test();
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
}

申请失败是自动去抛异常。

 new的底层

总结:

注意:并不是运算符重载,因为没有自定义类型的参数。

 c++程序内存区域划分_第10张图片

new就相当于是malloc的封装,不同点在于申请内存失败时抛异常。

 对于operator new的使用:

#include
using namespace std;



void test()
{
	while (1)
	{
		int*p1 = (int*)operator new(102400);
		if (p1)
		{
			cout << p1 << endl;
		}
		else
		{
			cout << "申请失败" << endl;
			break;
		}
	}
}
int main()
{
	try{
		test();
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
}

c++程序内存区域划分_第11张图片

operator new的使用方法和malloc类似。

你可能感兴趣的:(c++,开发语言)