开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
内存四区
我们之前提到过,在C++程序中,该程序会拥有唯一的内存四区。作为学习编程者,我们必须知道什么数据存储在什么区域中,什么内存由我们开辟,由我们释放。
意义:内存四区可以让不同区域存放不同的数据,赋予变量不同的生命周期,让我们编程更加灵活。
代码区
代码区存放CPU的机器指令。可以理解为,代码区的数据是共享的(对于多次频繁使用的数据,只在内存中保留一份),是只读的(为了防止程序意外的修改他的指令)。
全局区
全局区存放的是,全局变量,静态变量,静态常量。 该区域的数据在程序运行结束后由系统本身自动释放。
局部变量:在函数体内部的变量 全局变量:在函数体外部的变量 静态变量:在普通变量前面加上static
代码区和全局区中的数据在程序运行之前就已经存在
栈区
存放函数的参数值,局部变量等。该区域的数据由编译器自动分配释放。
注意:不要返回局部变量的地址,因为栈区数据会由编译器自动开辟释放,第一次返回局部变量可以成功,因为编译器会做一次保留,但第二次会报错。
int* func() {
int a = 10;
retuen &a;
}
int main() {
int* p = func();
cout << *p << endl;//运行成功,因为编译器为了误操作会保留一次
cout << *p << endl;//数据不会二次保留
return 0;
}
堆区
我们主要利用new关键字在堆区开辟内存。该区域内存由程序员手动开辟手动释放。
在我们开辟内存,程序结束后我们会使用delete关键字将堆区内存主动释放,但注意,不要二次释放,程序会报错。
在下面的例子中,我们与栈区做对比。
int* func() {
int* p = new int(10);//开辟内存
return p;
}
int main() {
int* p = func();
cout << *p << endl;
cout << *p << endl;//均正常输出
delete p;
return 0;
}
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情