首页 > 系统相关 >【C/C++】4.C++的内存管理

【C/C++】4.C++的内存管理

时间:2024-10-29 17:47:13浏览次数:5  
标签:std 释放 管理 int C++ 内存 ptr 指针

1. C++内存区域

     C++程序的内存通常分为以下几部分:

  • 栈区(Stack)
    栈用于存储局部变量、函数参数等临时数据。当函数调用时会为局部变量自动分配栈内存,函数结束后会自动释放。栈的内存分配速度很快,但空间有限。

  • 堆区(Heap)
    堆用于动态分配内存。程序员可以在运行时申请内存,当不再使用时手动释放。这种内存管理更灵活,但需要注意内存泄漏的问题。

  • 全局/静态区(Global/Static)
    存储全局变量和静态变量。在程序开始时分配内存,并在程序结束后释放。

  • 代码区(Code)
    用于存放程序的可执行代码。通常只读,以防止程序被意外修改。


2. 内存管理方式

2.1 栈上分配

    栈上的内存分配和释放是自动完成的,不需要程序员手动管理。栈内存用于存储局部变量、函数参数等临时数据。

    void exampleFunction() {      int x = 10; // x 是栈上的局部变量      int y = 20; // y 是栈上的局部变量   } // exampleFunction结束后,x 和 y 的内存会自动释放

2.2 堆上分配

    堆上内存分配是动态的,需要程序员手动分配和释放。new运算符用于在堆上分配内存,delete用于释放内存。

    void exampleFunction() {     int* ptr = new int(10); // 动态分配一个int类型的内存,初始值为10     delete ptr; // 释放内存   }
  • 动态数组分配:   int* array = new int[5]; // 分配一个包含5个整数的数组 delete[] array; // 使用 delete[] 释放数组

注意:

     如果没有及时使用delete释放内存,就会导致内存泄漏(memory leak)。这是因为在程序运行期间,未释放的内存将无法被再次使用。


3. 智能指针(Smart Pointers)

     在现代C++中,智能指针用于简化内存管理,减少内存泄漏的风险。C++11提供了几种常见的智能指针:

  • std::unique_ptr
    独占式所有权,表示该对象只有一个所有者,离开作用域时会自动释放内存。

      #include <memory> std::unique_ptr<int> ptr = std::make_unique<int>(10); // 自动释放内存
  • std::shared_ptr
    共享所有权,可以有多个指针指向同一个对象。当最后一个指向对象的shared_ptr被销毁时,对象的内存才会被释放。

      #include <memory> std::shared_ptr<int> ptr1 = std::make_shared<int>(10); std::shared_ptr<int> ptr2 = ptr1;   // ptr1 和 ptr2共享同一个对象
  • std::weak_ptr
    辅助shared_ptr使用,不会增加对象的引用计数,常用于解决shared_ptr循环引用的问题。

      #include <memory> std::shared_ptr<int> sharedPtr = std::make_shared<int>(10); std::weak_ptr<int> weakPtr = sharedPtr;  // weakPtr不会影响sharedPtr的引用计数

4. 常见的内存管理问题

4.1 内存泄漏(Memory Leak)

      内存泄漏是指程序在堆上分配了内存,但没有释放,导致内存永久占用。长时间运行的程序(如服务器)如果出现内存泄漏,可能会耗尽系统内存。

      示例:

     void memoryLeakExample() {        int* ptr = new int(10); // 忘记释放 ptr,导致内存泄漏    }

4.2 悬空指针(Dangling Pointer)

      悬空指针指的是指向已经被释放内存的指针,若尝试访问该内存会导致未定义行为。

      示例:

     void danglingPointerExample() {       int* ptr = new int(10);       delete ptr; // 释放内存       // ptr 现在是悬空指针    }

4.3 野指针(Wild Pointer)

      野指针是指未初始化的指针,其指向未知的内存地址,容易导致程序崩溃。

      示例:

     void wildPointerExample() {        int* ptr; // 未初始化,ptr是野指针        *ptr = 10; // 可能导致程序崩溃    }

5. C++ RAII原则

      RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种重要的内存管理原则。
      它强调在构造对象时获取资源,并在对象销毁时释放资源。智能指针和标准库容器(如std::vector)都遵循RAII原则,可以自动管理内存的分配和释放,减少了手动管理的麻烦。遵循RAII原则可以有效减少内存管理的错误,提高程序的安全性和健壮性。

     示例:

    #include <iostream>   #include <vector>   void raiiExample() {      std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 vector 自动管理内存      // vector 离开作用域时自动释放内存   }

标签:std,释放,管理,int,C++,内存,ptr,指针
From: https://www.cnblogs.com/luckyyys/p/18514053

相关文章

  • 国标GB28181摄像机接入LiteGBS国标GB28181设备管理软件提升管理效率
    在信息技术迅猛发展和安全需求日益增加的今天,视频监控系统已成为我们生活中的一个重要组成部分。它在公共安全、城市治理、企业安全防护以及各类建筑项目中扮演着至关重要的角色。正是在这样的大环境下,遵循国家标准GB28181协议的LiteGBS视频云服务应需而生,它以全面的功能和灵活的......
  • RBE104TC C/C++ Programming Language
    RBE104TCC/C++ProgrammingLanguageAssignment2ContributiontotheOverallMarks70%IssueDateSubmissionDeadline3rdNovember2024AssignmentOverview:ThisassignmentisgearedtowardsassessingfundamentalcodingconceptsinC/C++andinitiatingthe......
  • 袋鼠云产品功能更新报告12期|让数据资产管理更高效
    本期,我们更新和优化了数据资产平台相关功能,为您提供更高效的产品能力。以下为第12期袋鼠云产品功能更新报告,请继续阅读。一、【元数据】重点更新|01元数据管理优化,支持配置表生命周期之前系统中缺少一个可以基于数据源和数据库维度,批量配置数据表生命周期的入口,导致用户在处理......
  • (开题报告)django+vue企业设备管理系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于企业设备管理系统的研究,现有研究主要以传统管理模式或单一功能模块开发为主。在国内外,虽然企业设备管理系统有一定的研究成果,但专......
  • java计算机毕业设计作业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,教育领域也在不断探索和应用新技术,以提高教学质量和管理效率。传统的作业管理方式通常依赖于纸质媒介和面对面的交流,这种方式......
  • 国标GB28181设备管理软件EasyGBS国标GB28181视频平台SIP信令注册流程是怎样的?
    在当今快速发展的科技时代,视频监控技术作为安全防范的重要手段,已经广泛应用于各行各业。从公共场所的安全监控到企业内部的生产监管,再到智能家居的日常防护,视频监控无处不在地守护着我们的安全。然而,随着监控规模的不断扩大和监控需求的日益复杂,如何高效、智能地管理这些监控资......
  • 多品牌NVR管理工具/设备EasyNVR多个NVR同时管理实现监控网络高效整合
    随着科技的飞速进步,监控视频在各行各业中的应用变得愈发广泛。为了更好地管理和运用这些宝贵的视频资源,对视频进行联网与整合的需求也随之增加。视频联网技术通过汇聚不同地理位置和设备的视频资源,实现了实时的资源共享与集中化管控。在公共安全、交通监控、商业安防等多个领域......
  • 后台管理系统的通用权限解决方案(六)SpringBoot整合Logback实现日志记录
    1Logback介绍1.1Logback的组件由上图可知,Logback和Log4j都是slf4j规范的具体实现。在程序中直接调用Logback的API其实都是slf4j规范定义好的API,其底层则是真正的日志实现组件—Logback或者Log4j。Logback构建在三个主要的类上:Logger,Appender和Layout。这三个不同类型......
  • 在质量管理中什么是缺陷问题
    在质量管理中,缺陷问题是指产品或服务在设计、生产、交付等环节中出现的不符合标准或预期的问题。这些问题可能会影响产品的性能、安全、可靠性,甚至可能影响用户的满意度和公司的声誉。通过有效的质量管理,可以发现和解决缺陷问题,提高产品的质量和满意度。在质量管理的过程中,了......
  • SpringBoot请销假管理信息系统8wz1t(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,领导,在线请假,提交审批,审批信息,延假申请,在线销假,学生统计,班级统计,学院统计开题报告内容一、课题背景与意义随着教育管理的信息化发展,传统的......