c++随记

内存溢出与内存泄漏的区别

今天老师提出的概念问题,搜索了一下

# 内存泄漏与内存溢出的区别

内存泄漏(Memory Leak)和内存溢出(Memory Overflow/Out of Memory)是两种常见的内存相关问题,但它们的含义和产生原因不同:

## 内存泄漏 (Memory Leak)

  • **定义**:程序中已动态分配的堆内存由于某种原因未能被释放,造成系统内存的浪费

  • **原因**:

  • **分配的内存未被正确释放(如忘记调用free/delete)

  • 对象引用未被及时清除(如集合中的对象不再使用但未被移除)

  • 监听器未注销

  • 静态集合持有对象引用**

  • **特点**:

  • **逐渐消耗内存

  • 长时间运行后可能导致内存不足

  • 泄漏的内存无法被再次使用**

内存溢出 (Memory Overflow/Out of Memory)

  • **定义**:程序申请内存时,系统没有足够的内存空间供其使用

  • **原因**:

  • **内存泄漏累积导致

  • 程序确实需要的内存超过系统可提供量

  • 内存设置过小(如JVM堆内存设置不足)

  • **特点**:

  • 通常是突然发生的

  • 直接导致程序崩溃或异常**

关键区别

  1. **因果关系**:内存泄漏长期积累可能导致内存溢出
  2. **发生时机**:泄漏是渐进过程,溢出是瞬时事件
  3. **可恢复性**:泄漏的内存无法回收,溢出在增加内存后可能解决
  4. **表现形式**:泄漏可能不会立即显现问题,溢出会直接导致程序失败

命名空间

在C语言编程的时候,如果出现了同名的全局变量和同名的函数就会编译出错 ,虽然他们在不同的文件中,但是由于同名,编译的时候就会报错。

在C++中提供了命名空间的机制来解决同名符号冲突的问题,一个命名空间就是一个作用域,在不同的命名空间中命名相同的符号代表不同的实体。

空间定义

cpp 复制代码
namespace 名称
{
    成员
}

namespace 是命名空间定义的关键字

名称 是定义的时候指定的命名空间的名字

成员 是命名空间定义的时候包含的内容, 可以是变量、常量、函数、结构体/联合体/枚举、类、嵌套名字空间

cpp 复制代码
namespace A
{
    int global = 10;
    void function(void)
    {
        printf("This is namespace A\n");
    }
}
namespace B
{
    int global = 20;
    void function(void)
    {
        printf("This is namespace B\n");
    }    
}

空间声明

cpp 复制代码
namespace 命名
{
    成员声明;
}
cpp 复制代码
namespace A
{
    extern int global;
    extern void function(void);
}

空间成员使用

**1.通过 命名空间名字::**成员 的方式使用命名空间的成员。

cpp 复制代码
int main(void)
{
    A::global = 500;
    B::function();
}

2. 通过使用 using namespace 命名空间名字 语句直接使用命名空间成员

cpp 复制代码
using namespace A;
int main(void)
{
    global = 500;
    function();
    return 0;
}

3.声明命名空间中的一个变量(不常用)

cpp 复制代码
using A::global;//声明命名空间A中的变量global
int main(void)
{
    global = 500;
    return 0;
}

命名空间别名

可以给命名空间起一个别名 , 别名是已定义的命名的可替换的名称 。一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。

别名定义 : namespace 别名 = 已定义的命名空间名称

cpp 复制代码
namespace A
{
    int global = 10;
    void function(void)
    {
        printf("This is namespace A\n");
    }
}
namespace A_Alias = A;
int main(void)
{
    cout << "global : " << A::global << endl;
    cout << "global : " << A_Alias::global << endl;
    return 0;
}

全局命名空间

定义在 全局作用域的名字(在任意类、函数或命名空间外部声明的名字) ,他们是定义在全局命名空间中的。全局命名空间是隐式声明的,存在于每个程序中 。

全局命名空间的成员使用 ::成员名 的形式来访问

cpp 复制代码
int global = 10;
void function(void)
{
    cout << "function" << endl;
}
int main()
{
    ::global = 50;
    ::function();
    return 0;
}

匿名命名空间

未命名的命名空间与其他命名空间不同, 未命名的命名空间定义的成员,只能在它所定义的文件中使用,不能跨文件访问

cpp 复制代码
namespace
{
    int global = 10;
    void function(void)
     {
        printf("Hello World\n");
        return;
     }
}
int main(void)
{
    global = 200;//直接使用,不能跨文件使用
    function(); //直接使用,不能跨文件使用
    return 0;
}
相关推荐
行者9633 分钟前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon43 分钟前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio1 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词1 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派2 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx2 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
charlie1145141912 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
古城小栈3 小时前
Rust 网络请求库:reqwest
开发语言·网络·rust
hqwest3 小时前
码上通QT实战12--监控页面04-绘制6个灯珠及开关
开发语言·qt·qpainter·qt事件·stackedwidget
i橡皮擦3 小时前
TheIsle恐龙岛读取游戏基址做插件(C#语言)
开发语言·游戏·c#·恐龙岛·theisle