第二节 · 封印符文 · 智能指针

程序运行时,内存被划分为不同的区域,其中最重要的两个是。理解它们的区别对于写出高效、安全的代码至关重要。


栈内存

栈是自动管理的内存区域。当你声明一个局部变量时,它就在栈上分配。当变量离开作用域时,自动释放。

void foo()
{
    int n = 42;           // 在栈上分配
    string s = "hello";   // 也在栈上
    
    // 函数结束时,n 和 s 自动销毁
}

栈的特点:

  • 分配速度快(只需移动栈指针)

  • 自动管理,无需手动释放

  • 大小有限(通常几 MB)

  • 生命周期与作用域绑定


堆内存

堆是手动管理的内存区域。使用 new 分配,使用 delete 释放。

堆的特点:

  • 分配速度较慢

  • 需要手动管理(或使用智能指针)

  • 大小只受系统内存限制

  • 生命周期由程序员控制


数组的动态分配


类比:租房与购房

  • 像住公寓:入住快、退房自动办理,但空间有限

  • 像买房子:手续复杂、需要自己处理过户,但空间任你选


常见错误


对象的动态分配


返回动态分配的内存


堆内存的必要性

什么时候必须用堆?


检测内存问题

可以使用工具检测内存泄漏:

  • Valgrind(Linux)

  • Visual Studio 内存诊断(Windows)

  • AddressSanitizer(-fsanitize=address)


习题

  • 解释为什么返回局部变量的指针是危险的。

  • 编写代码演示内存泄漏,然后修复它。

  • new 失败时会发生什么?如何处理?

Last updated