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