首页 > 其他分享 >堆空间?栈区?不慌!看完就通透!!

堆空间?栈区?不慌!看完就通透!!

时间:2024-07-20 16:57:58浏览次数:27  
标签:栈区 通透 int 内存 空间 new ptr delete

前言

       在进行开发和学习的过程中,我们老是看到或听到“堆空间”,“栈区”,那么他们到底都是什么?有什么关联和区别呢?接下来我们一起看看。

什么是堆空间

       堆空间是内存管理中的一种区域,用于动态地分配内存给程序中的对象。堆空间允许程序在运行时根据需要分配和释放内存

什么是栈区

       栈区是内存中的一个区域,用于存储局部变量和函数调用的上下文信息。栈是一种后进先出的数据结构,它允许程序在调用函数时自动地分配和释放内存。

堆空间和栈区的区别

也就是说堆空间是程序员自己控制的,栈区是编译器控制的。

void demo()
{
int a=5;
double=1.9;
{
char c='A';
}//------c被释放

}//------a,b被释放
//栈空间完全跟随代码块不可手控控制

既然堆空间是我们程序员控制的,那它要怎么控制呢 

方式一:通过库函数

#include <cstdlib>//堆操作库函数所需头文件
void Demo(){
void *buf = std::malloc(16);//申请16bytes堆空间
if(buf != nullptr){如果堆空间不足会返回空指针
// 按需使用
std::free(buf);-用完记得释放

方式二:使用mallocfree

#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    // 分配堆空间来存储一个int类型的值  
    int *ptr = (int*)malloc(sizeof(int));  
    if (ptr == NULL) {  
        // 内存分配失败  
        printf("Memory allocation failed\n");  
        return 1;  
    }  
  
    // 使用分配的内存  
    *ptr = 10;  
    printf("Value = %d\n", *ptr);  
  
    // 释放内存  
    free(ptr);  
  
    return 0;  
}

方式三:中使用newdelete

#include <iostream>  
  
int main() {  
    // 分配堆空间来存储一个int类型的值  
    int* ptr = new int;  
  
    // 使用分配的内存  
    *ptr = 20;  
    std::cout << "Value = " << *ptr << std::endl;  
  
    // 释放内存  
    delete ptr;  
  
    return 0;  
}

方式四:使用new[]delete[](对于数组)

#include <iostream>  
  
int main() {  
    // 分配堆空间来存储一个int类型的数组,大小为5  
    int* arr = new int[5];  
  
    // 初始化数组  
    for (int i = 0; i < 5; ++i) {  
        arr[i] = i * 2;  
    }  
  
    // 使用数组  
    for (int i = 0; i < 5; ++i) {  
        std::cout << arr[i] << " ";  
    }  
    std::cout << std::endl;  
  
    // 释放内存  
    delete[] arr;  
  
    return 0;  
}

注意

  • 使用mallocfree时,需要手动进行类型转换(如(int*)),而在C++中,使用newdelete时,不需要这样做,因为new操作符已经返回了正确的指针类型。
  • 当使用new[]分配数组时,必须使用delete[]来释放内存,而不是delete。这是因为delete[]会调用数组中每个对象的析构函数(如果有的话),而delete则只调用一个对象的析构函数。
  • 忘记释放分配的内存会导致内存泄漏,因此务必在不再需要堆内存时释放它。
  • 在C++中,除了直接使用newdelete之外,还可以使用智能指针(如std::unique_ptrstd::shared_ptr)来自动管理堆内存,从而减少内存泄漏的风险。

标签:栈区,通透,int,内存,空间,new,ptr,delete
From: https://blog.csdn.net/m0_67669662/article/details/140573458

相关文章

  • 基于卷积神经网络(CNNs)的无监督多模态子空间聚类方法
    基于卷积神经网络(CNNs)的无监督多模态子空间聚类方法引言基于卷积神经网络(CNNs)的无监督多模态子空间聚类方法是一种前沿技术,专门设计用于处理来自不同模态(如图像、文本、音频等)的高维数据,旨在自动学习表示并聚类这些数据,而无需任何标记信息。这种方法利用CNNs的特征提取能......
  • 鲁棒核稀疏子空间聚类模型(Robust Kernel Sparse Subspace Clustering, RKSSC)
    鲁棒核稀疏子空间聚类模型(RobustKernelSparseSubspaceClustering,RKSSC)引言鲁棒核稀疏子空间聚类模型(RKSSC)是一种用于处理高维数据的聚类技术,特别设计用于对抗数据中的噪声和异常值。该模型结合了稀疏表示、核方法和鲁棒优化策略,以在非线性子空间中寻找数据点的稀疏......
  • 网络空间资产测绘平台
    网络空间资产测绘平台网络空间资产测绘平台是一种专门用于对全球互联网空间中的各类资产进行全面、深入、实时探测和识别的技术平台。这些平台通过自动化的方式,对互联网上的服务器、设备、网站、域名、IP地址等资产进行扫描、识别和整理,形成完整的网络空间资产地图或数据库。主......
  • 高等代数 第三章 线性空间
    知识复习向量的线性关系我们先从方程入手把它写成向量的形式,分别用\(\alpha_i,\beta\)表示上面的列向量,那么方程等价于\(\sumx_i\alpha_i=\beta\)如果考虑齐次方程,那么$\sumx_i\alpha_i=0$,\(0\)肯定是一个解,但是我们想知道的是有没有非平凡的解,也就是说有没有一组不......
  • PyMOL测量蛋白质中两个原子或残基空间距离
    测量距离在Pymol中实现两个原子间的空间距离测量一、 以PDB:4hbk为例,打开PyMOL运行命令载入蛋白(也可以直接 .pdb格式导入) 二、点击菜单栏中的Wizard->Measurement 就可以进行距离测量。然后分别选择两个2个原子就可以显示这2个原子的距离。比如我们想测定TYR48中侧链......
  • TS 入门(七):TypeScript模块与命名空间
    目录前言回顾泛型编程1.模块a.导入和导出b.默认导出c.重命名导入和导出2.命名空间a.定义命名空间b.嵌套命名空间3.动态导入与条件导入a.动态导入b.条件导入结语前言在前几章中,我们学习了TypeScript的基础知识、函数与对象类型、接口与类、以及泛型编......
  • 【Windows】系统盘空间不足?WizTree 和 DISM++ 来帮忙
    当您的系统盘空间接近饱和时,了解硬盘空间的使用情况变得尤为重要。在这种情况下,您可以利用Windows内置的存储使用工具来快速查看哪些文件和应用程序占用了大量空间,并采取相应措施进行清理。此外,第三方工具如WizTree可以提供更深入的分析和更高级的清理选项。使用Windo......
  • 【YashanDB知识库】swap空间使用超大报错
    问题描述问题单使用GROUP_CONCAT函数时,数据库swap表空间上涨厉害测试用例droptabletmp1;createtabletmp1(c1int,c2double,c3varchar(500),c4int);beginforiin1..4994196loopinsertintotmp1selectrandom()*100000000,random()*5000000,'helloworldte......
  • 人生低谷来撸C#--011命名空间
    命名空间 提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。如......
  • 海量元宇宙场景模板,视创云展解锁你的无限创意虚拟空间!
    ​一站式元宇宙虚拟活动云平台视创云展,集成了海量的元宇宙场景模板,并借助其强大的模块化功能体系,使得用户能够轻松跨越技术门槛,迅速创作出高质量的3D场景。用户可自由发挥创意,构建出独一无二的元宇宙空间,完美契合多样化的场景应用需求。1、海量模板,随心选择:视创云展拥有海量......