C++ 内存分区

内存分段

堆
栈
全局静态区
常量文本区
程序代码段
  1. 堆:由程序员自己管理,需要自己释放,主要由malloc free new delete 管理 频繁的创建容易造成内存碎片化;
  2. 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元被自动释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量比较有限,window1Mb左右,linux8Mb左右,可以自己设置;
  3. 全局静态区:全局变量哥静态变量被分配到同一块内存中;
  4. 常量文本区:存放程序的字符常量,不允许被修改;
  5. 程序代码段: 主要存放二进制代码;

关键字static

static 修饰局部变量:
	生命周期和程序相同,但是作用域不变,只会初始化一次 
static 修饰全局变量
	本文件可见,生命周期和程序一样,	
static 修饰普通函数
	仅本文件可见;
static 修饰成员函数
	只能访问类的静态成员;
static 修饰成员变量 
	需要在全局进行初始化

内存问题

内存泄漏:程序中己动态分配的堆内存由于某种原因程序未释放或无
法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃
等严重后果。
内存越界:访问没有定义的内存
		避免错误:
			1.避免数组越界;
			2.使用不安全的函数sprintf、strcpy、strcat
			3.避免忽略字符串后面的'\0'
段错误:尝试访问不可访问的内存
	避免错误:
		定义指针后初始化
		数组下标是否越界
		在堆上分配空间是否足够(内存限制)
		变量处理时的格式是否正确

常用的内存检测工具
windows VLD
百度云链接:https://pan.baidu.com/s/1Uq-9p-WkO10MVfXFnmILVQ
提取码:1234

安装之后包含以下头文件 vld.h
//vs 需要设置附加库目录

#include <iostream>
#include <vld.h>
using namespace std;
int main(){
	char * pChar = new char[20];
    std::cout << "Hello World!\n";
    return 0;
    
}

运行之后的结果
在这里插入图片描述
linux:valgrind
详细使用链接:https://www.cnblogs.com/AndyStudy/p/6409287.html

// 如果想详细了解内存管理,可以去看看linux的内存管理
内存分段机制,内存分页机制,对文件的管理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值