侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

动态内存分配与释放

2025-12-11 / 0 评论 / 4 阅读

题目

动态内存分配与释放

信息

  • 类型:问答
  • 难度:⭐

考点

动态内存分配,内存释放,内存泄漏

快速回答

以下代码存在内存泄漏问题:

  • 使用new分配内存后未调用delete释放
  • 程序退出时未回收堆内存

修正方法:

  1. 在指针不再使用时添加delete ptr;
  2. 释放后建议将指针置为nullptr
## 解析

问题代码分析

#include <iostream>
using namespace std;

int main() {
    int* ptr = new int(10);  // 动态分配内存
    cout << *ptr << endl;   // 使用指针
    // ... 其他代码
    return 0;               // 退出前未释放内存
}

原理说明

C++中动态内存管理遵循谁分配谁释放原则:

  • new操作符在堆(heap)上分配内存
  • 分配的内存不会自动回收,必须显式调用delete
  • 未释放的内存会导致内存泄漏,程序长时间运行可能耗尽内存

修正代码示例

#include <iostream>
using namespace std;

int main() {
    int* ptr = new int(10);  // 分配
    cout << *ptr << endl;

    delete ptr;   // 关键修正:释放内存
    ptr = nullptr; // 最佳实践:防止野指针

    return 0;
}

最佳实践

  • 配对使用:每个new必须有对应的delete
  • 及时释放:内存不再使用时立即释放
  • 置空指针:释放后设置ptr=nullptr避免野指针
  • 优先使用智能指针:C++11+推荐unique_ptr/shared_ptr自动管理内存

常见错误

  • ❌ 忘记delete(本题核心错误)
  • ❌ 重复释放:对同一指针多次delete导致崩溃
  • ❌ 访问已释放内存:释放后未置空导致野指针

扩展知识

  • 作用域局限:动态内存的生命周期不受作用域限制
  • RAII原则:资源获取即初始化,智能指针基于此实现
  • 内存泄漏检测工具:Valgrind(linux)/Dr.Memory(windows)可检测泄漏
  • 替代方案:小型对象优先使用栈内存(自动管理)