c++内存分配

想象一下你有一个房子,房子里有很多房间,每个房间都可以用来存放东西。在C++中,内存管理就像是你在设计和建造这个房子。你可以自己决定房间的数量和大小,也可以随时动态地改变它们。但是,你需要小心地管理这些房间,确保你不会浪费空间或者让房间里的东西互相干扰。所以,C++中的内存管理就是你在思考如何合理利用和组织这些房间,确保你的程序可以高效地运行。


c++内存分为五个区:栈,堆,自由存储区,全局(静态)存储区,常量存储区

  • 局部作用域中的局部变量、函数参数以及函数调用的返回地址等信息在堆中创建,栈的大小是在程序开始运行时(或线程创建时)确定的,通常是一个固定的值。一旦函数返回或局部变量超出其作用域时,栈上的内存会自动被释放。
  • 栈是由系统提供的结构,计算机会在底层对栈提供支持,所以栈的效率会比较高
#include <iostream>  
using namespace std;
  
void functionOnStack() {  
    int stackVariable = 42; // 局部变量,存储在栈上  
    cout << "Stack variable: " << stackVariable << endl;  
    // stackVariable 在这里离开作用域,其内存自动释放  
}  
  
int main() {  
    functionOnStack(); // 调用函数,局部变量在栈上分配和释放  
    return 0;  
}

存储动态分配的对象,用new/malloc分配,delete/free释放。这种分配方式允许程序在运行时根据需要分配任意数量的内存,并且这些对象的存在时间不受其作用域的限制,只要程序不主动释放它们(使用 delete 运算符或 free 函数),它们就会一直占用内存。

 栈和堆的区别请看c++中的堆和栈-CSDN博客

new/malloc和delete/free的区别请看:c++中既然有了malloc/free为什么还要有new/delete呢-CSDN博客

#include <iostream> 
using namespace std;
  
int* createHeapVariable() {  
    int* heapVariable = new int(42); // 在堆上动态分配内存  
    return heapVariable; // 返回指针,允许在函数外部访问堆上的变量  
}  
  
int main() {  
    int* ptr = createHeapVariable(); // 调用函数,获取堆上变量的指针  
    std::cout << "Heap variable: " << *ptr << endl;  
    delete ptr; // 手动释放堆上分配的内存  
    return 0;  
}

自由存储区

由new申请的内存就是自由存储区(在C++标准中,“堆”这个术语并没有明确定义为一个具体的内存区域,而是更多地用于描述一种动态内存管理机制。而“自由存储区”则是C++标准明确提到的一个概念,它是指通过new分配和delete释放的内存区域。因此,虽然“自由存储区”和“堆”在严格意义上可能不完全等同,但在日常编程和讨论中,它们通常被视为同一概念,指的是用于动态内存分配的区域。)

全局(静态)存储区

存储全局变量、静态变量(包括静态局部变量和静态类成员)以及常量字符串,内存在编译期间就已经分配好,在程序运行阶段一直存在。

#include <iostream>  
using namespace std;
  
int globalVariable = 100; // 全局变量,存储在全局/静态存储区  
  
void functionWithStaticVariable() {  
    static int staticVariable = 200; // 静态局部变量,也存储在全局/静态存储区  
    cout << "Static variable: " << staticVariable << endl;  
}  
  
int main() {  
    cout << "Global variable: " << globalVariable << endl;  
    functionWithStaticVariable(); // 调用函数,静态变量在全局/静态存储区分配和保留  
    // 全局变量和静态变量在程序结束时自动释放  
    return 0;  
}

常量存储区

常量存储区并不是一个独立的内存区域,而是通常包含在全局/静态存储区中。但为了解释方便,我们可以将其视为一个单独的类别。

  • 存储常量,如const修饰的变量和字符串常量。
  • 常量在程序运行期间不能被修改。字符串常量通常存储在只读数据段中,以防止被意外修改。
#include <iostream>  
using namesace std;
  
const int constVariable = 300; // const 变量,可能存储在常量存储区或全局/静态存储区  
  
int main() {  
    const char* stringConstant = "Hello, World!"; // 字符串常量,存储在常量存储区  
    cout << "Const variable: " << constVariable << endl;  
    cout << "String constant: " << stringConstant << endl;  
    // constVariable 和 stringConstant 的值在程序执行期间不会改变  
    return 0;  
}

总结

  • :临时存储,自动管理。
  • (自由存储区):动态存储,需要显式管理。
  • 全局/静态:贯穿程序生命周期,自动管理。
  • 常量:存储常量数据,通常包含在全局/静态存储区中,只读。
  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值