IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 内存分布及管理 -> 正文阅读

[C++知识库]内存分布及管理

1.内存分布

在这里插入图片描述

2.C与C++内存管理的区别

(1)C++中如果是申请内置类型对象或者数组,malloc和new没什么区别,new和malloc都可用于申请动态内存,new是一个操作符,malloc是一个函数
(2)如果时自定义类型,区别很大,new和delete是开空间+初始化 析构清理+释放空间,malloc和free仅仅是开空间+释放空间
(3)建议在C++中,无论是内置类型还是自定义类型的申请释放,尽量使用new和delete
(4)C++中,有多少个值就会调用多少次构造函数与析构函数
(5)new和malloc都是保留字,需要头文件支持,需要头文件malloc.h,只是平时这个头文件已经被其他头文件所包含了,用的时候很少单独引入
(6)delete不加[],编译不会报错,也不会造成内存泄漏,建议针对数组释放使用delete[],如果是自定义类型,不使用方括号就会运行时错误

//C与C++区别
//1.C++中如果是申请内置类型对象或者数组,malloc和new没什么区别
//2.如果时自定义类型,区别很大,new和delete是开空间+初始化  析构清理+释放空间,malloc和free仅仅是开空间+释放空间
//3.建议在C++中,无论是内置类型还是自定义类型的申请释放,尽量使用new和delete
struct ListNode
{
	//struct ListNode* _next;  //C
	ListNode* _next;
	ListNode* _prev;
	int _val;

	ListNode(int val = 0)
		:_next(nullptr)
		, _prev(nullptr)
		, _val(val)
	{
		cout << "ListNode(int val = 0)" << endl;
	}
};
int main()
{
	//C中malloc只是开空间  free释放空间
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	free(n1);
	
	//cpp new 针对自定义类型,开空间+构造函数初始化
	//delete 针对自定义类型,析构函数清理+释放空间
	//单个支持传参,多个不支持传参
	ListNode* n2 = new ListNode(5);   //传值为val = 5   相当于C中BuyListNode(5)
	delete n2;

	//开辟多个对象
	struct ListNode* arr3 = (struct ListNode*)malloc(sizeof(struct ListNode)*4);
	free(arr3);
	
	//多个传参用花括号
	ListNode* arr4 = new ListNode[4]{1,2,3,4};   //调用4次构造函数
	delete[] arr4;
	//delete arr4;  //不匹配会崩溃,不会造成内存泄漏

	int* p1 = new int(0);
	int* p2 = new int[4]{1, 2, 3, 4};
	return 0;
}

内存管理

int main()
{
	//new/delete和malloc/free 针对内置类型,没有任何差别,只是用法不一样
	//申请一个10个int的数组
	//new/delete new[]/delete[]一定要匹配,否则可能会出错
	int* p1 = (int*)malloc(sizeof(int)* 10);
	int* p2 = new int[10];

	free(p1);
	delete[]p2;

	//申请单个int对象
	int* p3 = (int*)malloc(sizeof(int));
	int* p4 = new int;

	free (p3);
	delete p4;
	return 0;
}

3.应用

malloc/new最大能申请多大的空间?如何malloc出4G的空间?

//malloc/new最大能申请多大的空间
//32位下,2G左右
//如何malloc出4G的空间
int main()
{
	//1byte = 8bit
	//1KB = 1024byte
	//1MB = 1024KB
	//1GB = 1024MB
	//1TB = 1024GB

	//申请的整块空间
	void* p1 = malloc(1024 * 1024 * 1024);  //1GB
	//void* p1 = malloc(1024 * 1024 * 1024 * 2);  //2G不能申请了
	void* p1 = malloc(1024 * 1024 * 1024 * 1.5);  //1.5G能申请
	void* p1 = malloc(1024 * 1024 * 1024* 1.8);   //也能
	void* p1 = malloc(1024 * 1024 * 1024 * 1.9);  //不能


	//如何malloc出4G的空间
	//换成64位的
	void* p2 = malloc(0xffffffff);  //4GB
	cout << p1 << endl;
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:05:17  更:2021-07-16 11:07:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 13:08:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码