首页 > 系统相关 >C++中出了作用域如何释放内存

C++中出了作用域如何释放内存

时间:2024-12-17 23:21:54浏览次数:6  
标签:std 释放 作用域 C++ 内存 指针 分配 中出

在 C++ 中,是否会在作用域结束后自动释放内存,取决于内存的分配方式:


1. 栈内存分配

如果变量是在 (stack)上分配的,那么当变量超出其作用域时,内存会自动释放。

示例:栈上分配

#include <iostream>
using namespace std;

void func() {
    int a = 42; // 栈上分配
    cout << a << endl;
} // 作用域结束,a 的内存被自动释放

int main() {
    func();
    return 0;
}

行为

  • a 是一个局部变量,存储在栈上。
  • 当 func 函数执行完毕时,栈上的内存自动被回收,程序员无需干预。

2. 堆内存分配

如果内存是在 (heap)上分配的(通过 new 或 malloc 等),那么超出作用域后,内存不会自动释放。程序员需要手动释放这部分内存,否则会导致 内存泄漏

示例:堆上分配

#include <iostream>
using namespace std;

void func() {
    int* a = new int(42); // 堆上分配
    cout << *a << endl;
    // 作用域结束,但没有释放 a 所指向的内存
}

int main() {
    func();
    return 0; // 堆上分配的内存泄漏
}

行为

  • 虽然 a 是局部变量,但它指向的堆内存不会被自动释放。
  • 必须在程序中显式调用 delete a 来释放内存。

3. 静态变量

静态变量或全局变量在程序结束时会自动释放,但其生命周期贯穿整个程序。

示例:静态变量

#include <iostream>
using namespace std;

void func() {
    static int a = 42; // 静态存储,内存直到程序结束时才释放
    cout << a << endl;
}

int main() {
    func();
    return 0;
}

行为

  • 静态变量 a 的内存不会因函数退出而释放,而是贯穿整个程序生命周期。

4. 智能指针

现代 C++ 提供了智能指针(如 std::unique_ptrstd::shared_ptr)来管理堆内存。当智能指针超出作用域时,它会自动释放内存,避免手动管理堆内存。

示例:使用智能指针

#include <iostream>
#include <memory>
using namespace std;

void func() {
    auto a = make_unique<int>(42); // 堆上分配,自动释放
    cout << *a << endl;
} // 作用域结束,a 的内存自动释放

int main() {
    func();
    return 0;
}

行为

  • 智能指针 a 会在作用域结束时自动释放其所管理的内存。

总结

分配方式自动释放内存?释放时间
栈上分配 变量超出作用域
堆上分配 必须手动调用 delete
静态/全局分配 程序退出时
智能指针(堆上) 超出智能指针的作用域时

建议

  • 优先使用栈内存,它简单且无额外开销。
  • 如果必须使用堆内存,尽量使用智能指针(std::unique_ptrstd::shared_ptr)代替手动管理内存。

标签:std,释放,作用域,C++,内存,指针,分配,中出
From: https://www.cnblogs.com/chentiao/p/18613638

相关文章

  • Memory Leak Detector:C++内存泄漏常见原因分析_2024-07-23_09-29-09.Tex
    MemoryLeakDetector:C++内存泄漏常见原因分析C++内存管理基础动态内存分配与释放在C++中,动态内存管理是通过new和delete操作符来实现的。new操作符用于在运行时分配内存,而delete操作符用于释放之前分配的内存。理解动态内存分配与释放的机制对于避免内存泄漏至关重要。......
  • C/C++语言基础--C++STL库=之仿函数、函数对象、bind、function简介
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言STL无疑是C++史上一个重要的发明,未来我将更新STL有关的知识点,入门绝对够了(看目录就知道了......
  • c++实验六
    task4:Vector.hpp:1#pragmaonce2#include<iostream>3#include<stdexcept>4usingnamespacestd;56template<typenameT>7classVector8{9private:10intsize;11T*ptr;12public:13Vector(......
  • c++:STL:string
    1.STL简介1.1什么是STLSTL(standardtemplatelibaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。1.2STL的六大组件STL有六大组件,其中现在最重要的是容器和算法两类,容器其实就是数据结构2.......
  • C++从零到进阶 ④.1数组(介绍)
    本次是【C++从零到进阶】的第④课(介绍):数组介绍我们一个个来介绍提示:介绍单吃很难吃透,需要结合后续练习跟进才能做到掌握哦!新手食用:看目录更好找重点,!为重要或较详细内容一、数组的概念、定义与引用数组名的命名规则与变量名的命名规则一致;整型表达式表示数组元素的个数......
  • C++_数据结构-Map数据类型
    C++数据结构容器类:std::vector() map的内部结构是R-B-tree来实现的map:内部实现红黑树有序性,红黑树自动排序 unordered_map在C++11的时候被引入标准库哈希表HashMap散列表 skip-list跳表 #include<unordered_map>std::unnordered_ma......
  • 有关函数(c++)
    函数的分类:主函数,c++库函数,用户自定义函数一些基本的函数:从函数的作用范围可以分为:全局函数,成员函数(类的函数,后面在有关类的知识点会提到)注意:一个源代码文件中,定义的函数能否被其它文件调用。能被调用的函数在前面加extern(默认),而不能被调用的加static(不能省略)函数定义的......
  • VS code轻量级开发平台配置(C/C++版)
    写c++代码一直用VS,后来发现太麻烦了,转站vs code。按照步骤安装,问题不大。我也是跟着一个博主学习安装的,一起学习。一、VS code下载下载链接:DownloadVisualStudioCode-Mac,Linux,Windows对应选择适合自己电脑的版本,安装路径自定义时不要包含中文字符,其他的直接下一......
  • c++领域展开第四幕——类和对象(上篇收尾 this指针、c++和c语言的初步对比)超详细!!!!
    文章目录前言一、this指针二、c++和c语言的初步对比总结前言上篇我们初步学习了类的基本概念以及实例化今天我们来学习类的构造以及析构还有类的默认成员函数,类和对象这一部分都会有点难跟着我一起来吧一、this指针Date类中有Init与Print两个成员函数,函......
  • 【华为OD-E卷-寻找链表的中间结点 100分(python、java、c++、js、c)】
    【华为OD-E卷-寻找链表的中间结点100分(python、java、c++、js、c)】题目给定一个单链表L,请编写程序输出L中间结点保存的数据。如果有两个中间结点,则输出第二个中间结点保存的数据。例如:给定L为1→7→5,则输出应该为7;给定L为1→2→3→4,则输出应该为3;输入描述......