首页 > 系统相关 >c++内存分配

c++内存分配

时间:2024-06-01 18:33:39浏览次数:34  
标签:存储 常量 int c++ 静态 内存 new 分配

想象一下你有一个房子,房子里有很多房间,每个房间都可以用来存放东西。在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;  
}

总结

  • :临时存储,自动管理。
  • (自由存储区):动态存储,需要显式管理。
  • 全局/静态:贯穿程序生命周期,自动管理。
  • 常量:存储常量数据,通常包含在全局/静态存储区中,只读。

标签:存储,常量,int,c++,静态,内存,new,分配
From: https://blog.csdn.net/liangkepaofu/article/details/139276399

相关文章

  • C++Primer Plus第十一章类的使用,课后练习2,还是醉汉回家的故事 3,最慢和最快及平均概率
    修改程序清单11.15,使之报告N次测试中的最高、最低和平均步数(其中N是用户输入的整数)而不是报告每次测试的结果。头文件和实现文件不变,这里为大家方便还是贴上代码//vect.h--Vectorclasswith<<,modestate#if1#ifndef VECTOR_H_ #defineVECTOR_H_#include<io......
  • C++Primer Plus第十一章类的使用,课后练习1,还是醉汉回家的故事
    编程练习11.91.修改程序清单11.5,使之将一系列连续的随机漫步者位置写入到文件中。对于每个位置,用步号进行标示。另外,让该程序将初始条件(目标距离和步长)以及结果小结写入到该文件中。该文件的内容与下面类似:TargetDistance:100,stepSize:200:(xy)=(0,0)1:(x,y)=(-11.4......
  • sensitive-word 敏感词 v0.16.1 新特性支持字典内存资源释放
    敏感词系列sensitive-word-admin敏感词控台v1.2.0版本开源sensitive-word-adminv1.3.0发布如何支持分布式部署?01-开源敏感词工具入门使用02-如何实现一个敏感词工具?违禁词实现思路梳理03-敏感词之StopWord停止词优化与特殊符号04-敏感词之字典瘦身05-敏感词之DFA......
  • 【C++】内存管理
    文章目录1.回顾C/C++的内存管理2.C++内存管理方式2.1new/delete对于内置类型2.2new/delete对于自定义2.3operatornew与operatordelete函数2.4new和delete的实现原理2.5定位new表达式3.常见面试题1.回顾C/C++的内存管理首先,我们来回顾一下内存中的区域划分......
  • 【C/C++】--- 指针详解 2.0
    接下来进入指针的进阶部分,准备好大脑补充:(重点)数组名是数组首元素地址数组首元素地址和数组地址,值相同,但本质不同,区别在于二者的类型不相同比如数组intarr[10];数组首元素地址的类型:首先这是一个地址所以要用指针接收,(),然后是地址指向元素的类型为int,所以这个指针的......
  • macOS下使用bits/stdc++.h万能头文件
     macOS下使用bits/stdc++.h万能头文件1.终端中输入echo|g++-v-xc++-E-#include<...>searchstartshere:/usr/local/include/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/Library/Developer/CommandLineTools/usr/lib/clang/12.......
  • C++——类
    目录C++类访问权限虚函数1.定义底层实现2.构造函数/析构函数3.抽象类/纯虚函数常见问题1.虚函数不可以声明为inline吗2.构造函数为什么不能为虚函数?3.析构函数为什么可以为虚函数?4.构造函数和析构函数可以调用虚函数吗?5.虚析构函数的作用,父类的析构函数是否要设置为虚......
  • C++生产者消费者模型
    这里模拟了一个队列,5个消费者线程和5个生产者线程来共同使用队列里面的数据处理。包括了阻塞和非阻塞的出队入队方法。注意在添加线程时使用到了std::ref引用,在传参给线程时不能直接传入queue的引用,要使用std::ref才是真正意义上的引用,当直接使用queue编译器是不会通过的,因为其实......
  • C++:最小公倍数与最大公约数
    最大公约数(GreatestCommonDivisor,GCD)最小公倍数(LeastCommonMultiple,LCM)#include<iostream>//函数:计算两个数的最大公约数(GCD),这被称为欧几里得算法intgcd(inta,intb){if(b==0)returna;returngcd(b,a%b);}//函数:计算两个数的......
  • 定长内存池的实现
    定长内存池的实现如何实现定长如何直接向堆申请空间?定长内存池中应该包含哪些成员变量?内存池如何管理释放的对象?如何在32/64位平台下访问到内存块的前4/8个字节?释放对象内存池如何为我们申请对象?完整代码性能测试定长内存池只支持固定大小内存块的申请和释放如何......