C/C++动态内存分配,内存简述..malloc和free,new和delete简单用法.

本文深入解析C++中内存管理的五个关键区域:栈的局部变量存储、堆的动态内存分配与释放、全局/静态存储区的区别、常量存储区的只读特性,以及程序代码区。重点讲解malloc和free与new和delete的使用技巧和注意事项。
摘要由CSDN通过智能技术生成

内存

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对象相关

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值