当前位置:网站首页>虫子 内存管理 上

虫子 内存管理 上

2022-06-26 13:06:00 华为云

C++11 的成员初始化新玩法

C++11支持非静态成员变量在声明时进行初始化赋值,==但是要注意这里不是初始化,这里是给声明的成员变量缺省值。==

image-20220203155418443


再次理解封装

C++是基于面向对象的程序,==面向对象有三大特性即:封装、继承、多态==。
C++通过类,将一个对象的属性与行为结合在一起,使其更符合人们对于一件事物的认知,将属于该对象的所有东西打包在一起;通过访问限定符选择性的将其部分功能开放出来与其他对象进行交互,而对于对象内部的一些实现细节,外部用户不需要知道,知道了有些情况下也没用,反而增加了使用或者维护的难度,让整个事情复杂化。

image-20220203191415926


再次理解面向对象

可以看出面向对象其实是在模拟抽象映射现实世界

image-20220203194632084


C/C++内存管理


C/C++内存分布

我们先来看下面的一段代码和相关问题

image-20220203232950966

==虚拟进程地址空间==

image-20220203233228252

image-20220203225029023

image-20220203221503423

【说明】

  1. 又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共
    享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
  3. 用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段–存储全局数据和静态数据。
  5. 代码段–可执行的代码/只读常量。

C语言中动态内存管理方式

==malloc/calloc/realloc和free==

【面试题】

malloc/calloc/realloc的区别?

image-20220203235709830


C++内存管理方式

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:==通过new和delete操作符进行动态内存管理==。


new/delete操作内置类型

image-20220204090144093

int main(){	//c语言申请10个int的数组	int* pa = (int*)malloc(sizeof(int)*10);	//c++申请10个int的数组	int* pb = new int[10];	//c语言释放空间	free(pa);	//c++释放空间	delete[] pb;	//c语言申请1个int	int* a = (int*)malloc(sizeof(int));	//c++申请1个int	int* b = new int;	//c语言释放空间	free(a);	//c++释放空间	delete b;	return 0;}

image-20220204092440380

image-20220204094249552

struct ListNode{	ListNode* _next;	ListNode* _prev;	int _val;	ListNode(int val = 0)		:_next(nullptr)		, _prev(nullptr)		,_val(val)	{		cout << "ListNode(int val = 0" << endl;	}	~ListNode()	{		cout << "ListNode()" << endl;	}};int main(){	//c语言创建链表节点	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));	//free是直接释放空间	free(n1);	//c++创建链表节点	ListNode* n2 = new ListNode(10);	//delete 是先析构清理然后再释放空间	delete n2;	return 0;}

image-20220204094632934

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

image-20220204100444913

struct ListNode{	ListNode* _next;	ListNode* _prev;	int _val;	ListNode(int val = 0)		:_next(nullptr)		, _prev(nullptr)		, _val(val)	{		cout << "ListNode(int val = 0" << endl;	}	~ListNode()	{		cout << "ListNode()" << endl;	}};int main(){	//c语言创建链表节点	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));	//free是直接释放空间	free(n1);	//c++创建链表节点	ListNode* n2 = new ListNode[10]{1,2,3,4,5,6,7,8,9,0};	//delete 是先析构清理然后再释放空间	delete[] n2;	return 0;}

原网站

版权声明
本文为[华为云]所创,转载请带上原文链接,感谢
https://bbs.huaweicloud.com/blogs/361766