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/C++动态内存分配内存简述..malloc和freenew和delete简单用法. -> 正文阅读

[C++知识库]C/C++动态内存分配内存简述..malloc和freenew和delete简单用法.

内存

C++中内存分为5个区

1.栈

一般函数内的局部变量都会放到栈中, 有编译器自动分配和释放
栈有上限,越界会程序会崩溃
char buff[2000000]; //2M
vs下大约2M大小就会栈空间溢出崩溃
栈运行速度比堆快,空间有限,地址从高往低分配

2.堆

程序员用malloc/new分配, 用free/delete来释放,如果没有释放,程序接受后系统会回收.程序长时间运行,不释放内存会导致内存泄漏
特点运行速度慢,容易产生碎片,地址从低往高分配
只要不超过物理内存即可

3.全局/静态存储区

全局变量和静态变量static, 程序接受后会由系统释放
内部又分为BSS段和数据段,简单差别如下:
BSS段 存放程序中未初始化的全局变量
数据段 存放程序中已初始化的全局变量
了解即可

4.常量存储区

只读字符串常量

5.程序代码区

二进制文件

重点关注堆栈

malloc和free

c语言中:使用malloc和free分配和释放内存用, malloc()和free()是函数.
用法:

#include <stdlib.h>
void *malloc(int NumBytes); //malloc是函数,所以函数形参是要分配的字节数
//void*是可以强制转换类型
//需要free()函数释放内存;
void free(void *FirstByte)  //将malloc分配的内存空间还给程序,释放

//定义
	int* p = NULL;
	p = (int *)malloc(sizeof(int));  //malloc(4); 32位
	//malloc返回是void* ,这里要用int* 强转一次
	free(p); //释放

//返回值, 不为NULL即为成功
	if(p!=NULL)
	cout <<"分配成功" << endl;
//程序中最好加上防御式编程

char用法:

	char* point = NULL;
	point = (char*)malloc(100 * sizeof(char));
	if (point != NULL)
	{
		strcpy_s(point, 100,"hello world!");
		cout << point << endl;
		free(point);
	}

strcpy_s 更安全的版本,能够监测是否越界,报错出来警告,中间参数为目标大小
strcpy 越界不会警告,直接运行,如果空间不足会拷贝不全

new和delete

这俩是运算符,标识符,与malloc不同处之一
一样干的都是分配和释放内存的功能
new一般用法
指针变量名 = new 类型标识符;
指针变量名 = new 类型标识符(初始值);
指针变量名 = new 类型标识符[内存单元个数]; //分配数组

例1:

	int* test_new = new int;
	if (test_new != NULL)
	{
		*test_new = 8;
		cout << *test_new << endl;
		delete test_new;
	}

例2:

	int* test_new = new int(18);
	if (test_new != NULL)
	{
		//*test_new = 8;
		cout << *test_new << endl;
		delete test_new;
	}
	//输出:18

例3:

	int* pa = new int[100];  //开辟大小为100整型
	if (pa != NULL)
	{
		int* q = pa;
		*q++ = 8;
		*q++ = 18;

		cout << *pa << endl;  //8
		cout << *(pa + 1) << endl;  //18
		
		delete[] pa;//这里一定要加[]

	}

后续补充new对象相关

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 11:56:22  更:2021-08-26 11:58:23 
 
开发: 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年11日历 -2024/11/23 17:01:54-

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