c面向对象指针:内存

一、内存泄漏(delete和new的使用)

c面向对象指针:内存_第1张图片

c面向对象指针:内存_第2张图片

#include

int main()
{
	int a = 3, age = 4;
	int *p = &a;//声明指针
	
	printf("%d\n", *p);//解除引用
	
	printf("%d\n",*p * age);
	delete p;//释放内存, 
	
	p = new int;
	if(p == NULL){
		printf("Error!No memory for p\n");
	}
//	else printf("Ok\n");
	p = & age;
	int *p2 = &a;
	printf("%d", * p * *p2);//编译器能识别声明和乘号 
	return 0;
} 

 二、内存泄漏和野指针

c面向对象指针:内存_第3张图片

三、堆与栈 (c++内存管理三部分静态存储区、栈、堆)

1. 栈
是一种连续储存的数据结构,具有先进后出的性质。

通常的操作有入栈(压栈),出栈和栈顶元素。想要读取栈中的某个元素,就是将其之间的所有元素出栈才能完成。

2. 堆
是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。

堆和栈究竟有什么区别?
1.管理方式不同:

对于栈来讲,是由编译器自动管理,无需我们手工控制;
对于堆来说,释放工作由程序员控制,容易产生memory leak。
2.空间大小不同:

一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。
对于栈来讲,一般都是有一定的空间大小的。默认的栈空间大小是1M了。不过可以修改其大小。
3.能否产生碎片不同:

对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出。
4.生长方向不同:

对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
5.分配方式不同:

堆都是动态分配的,没有静态分配的堆。
栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由allocal 函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
6.分配效率不同:

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
 

————————————————
版权声明:本文为CSDN博主「WaitFoF」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41498261/article/details/83583466

四、在堆中创建对象时分配内存

局部变量:声明和定义在调用的时候同时进行内存分配。

全局变量:声明的时候不分配内存,定义的时候分配内存(注意,此处的全局变量是指多个文件调用,使用extern声明的。如果只单个文件调用,还是局部变量一样)。

函数:声明和定义的时候不分配内存,调用的时候分配内存。

结构体:声明和定义的时候不分配内存,实例化的时候分配内存。

类:声明和定义的时候不分配内存,实例化的时候分配内存。
————————————————
版权声明:本文为CSDN博主「最胖的棒棒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011553313/article/details/104170980

参考书籍《c++入门经典》第10章

你可能感兴趣的:(c语言)