2023吕鑫C++课程30g 百度网盘下载

70 阅读4分钟

2023吕鑫C++课程30g 百度网盘下载-------夏の哉-------97it.-------top/-------5204/

1338.jpg_wh860.jpg C++内存管理演进:从new/delete到智能指针的全面解析 C++作为一门系统级编程语言,其强大的内存管理能力一直是其核心优势之一。本文将系统性地介绍C++内存管理的发展历程,从基础的new/delete操作到现代智能指针体系,揭示内存管理技术背后的设计哲学和实现原理。 一、传统C++内存管理基础 1.1 new/delete操作符原理 new和delete是C++提供的动态内存管理操作符,相比C语言的malloc/free具有更丰富的特性:

                        Cpp
                        
                        int* ptr = new int(10);  // 分配并初始化

delete ptr; // 释放内存关键区别:

new会自动计算类型大小 new会调用构造函数 delete会调用析构函数 支持operator new/delete重载

1.2 数组内存管理 对于数组类型,C++提供了专门的语法:

                        Cpp
                        
                        int* arr = new int[100];  // 分配100个int

delete[] arr; // 必须使用delete[]常见错误示例:

                        Cpp
                        
                        char* pch = new char[100];

delete pch; // 错误!应该使用delete[]1.3 自定义内存管理 开发者可以重载operator new/delete实现定制化内存管理:

                        Cpp
                        
                        class MyClass {

public: static void* operator new(size_t size) { // 自定义分配逻辑 return ::operator new(size); }

static void operator delete(void* p) noexcept {
    // 自定义释放逻辑
    ::operator delete(p);
}

};二、传统内存管理的缺陷 2.1 常见问题类型 手动内存管理容易导致三类典型问题:

内存泄漏(忘记释放)

                        Cpp
                        
                        void leak() {
int* ptr = new int(10);
// 忘记delete

} 悬挂指针(多次释放)

                        Cpp
                        
                        int* ptr = new int(10);

delete ptr; delete ptr; // 未定义行为 异常安全问题

                        Cpp
                        
                        void unsafe() {
int* ptr = new int(10);
someFunction();  // 可能抛出异常
delete ptr;      // 可能不会执行

}2.2 跨模块管理难题 动态库边界处的内存管理尤为棘手:

                        Cpp
                        
                        // 模块A分配

extern "C" __declspec(dllexport) Student* createStudent() { return new Student(); }

// 模块B释放 extern "C" __declspec(dllimport) void destroyStudent(Student* stu) { delete stu; // 必须确保使用相同的CRT }三、智能指针体系详解 3.1 unique_ptr:独占所有权指针 C++11引入的轻量级智能指针:

                        Cpp
                        
                        #include <memory>

void safeFunc() { auto ptr = std::make_unique(10); // 推荐创建方式 if (someCondition) return; // 自动释放 }特点:

零额外开销(与裸指针相同大小) 禁止拷贝(保证所有权唯一) 支持移动语义

3.2 shared_ptr:共享所有权指针 基于引用计数的共享指针:

                        Cpp
                        
                        auto ptr1 = std::make_shared<int>(20);

{ auto ptr2 = ptr1; // 引用计数+1 } // 引用计数-1内存布局:

                        PlainText
                        
                        [控制块]

[引用计数][弱引用计数][删除器] [被管理对象]3.3 weak_ptr:解决循环引用 打破shared_ptr循环引用的观察指针:

                        Cpp
                        
                        class B; 

class A { std::shared_ptr b_ptr; }; class B { std::weak_ptr a_ptr; // 使用weak_ptr避免循环 };四、智能指针实现原理 4.1 RAII设计范式 资源获取即初始化(Resource Acquisition Is Initialization):

构造函数中获取资源 析构函数中释放资源 异常安全保证

4.2 控制块机制 shared_ptr的核心数据结构:

                        Cpp
                        
                        template<typename T>

struct ControlBlock { std::atomic<size_t> ref_count; std::atomic<size_t> weak_count; T* ptr; Deleter deleter; };内存开销:

unique_ptr:0额外开销 shared_ptr:约16-32字节控制块 weak_ptr:与shared_ptr共享控制块

五、性能分析与最佳实践 5.1 性能对比

操作 裸指针 unique_ptr shared_ptr

创建 1x 1-1.2x 2-3x

拷贝 1x N/A 3-5x

解引用 1x 1x 1x

5.2 使用建议

默认选择unique_ptr

                        Cpp
                        
                        auto resource = std::make_unique<Resource>();

共享所有权时才用shared_ptr

                        Cpp
                        
                        auto sharedRes = std::make_shared<SharedResource>();

避免原始指针传递所有权

                        Cpp
                        
                        void process(std::unique_ptr<Data> data);  // 明确所有权转移

工厂模式应用

                        Cpp
                        
                        static std::unique_ptr<Service> create() {
return std::make_unique<ServiceImpl>();

}

六、现代C++内存管理演进 6.1 C++14/17增强

make_unique成为标准(原为C++11扩展) shared_ptr支持数组类型 内存资源API(pmr)标准化

6.2 C++20新特性

std::make_shared支持对齐类型 std::atomic提供线程安全版本 智能指针与协程集成

七、总结与展望 C++内存管理的演进体现了从手动到自动、从复杂到简单的发展趋势:

发展阶段:

C风格(malloc/free) 面向对象(new/delete) RAII范式(智能指针) 安全抽象(标准库容器)

未来方向:

静态内存安全分析 区域内存管理 与垃圾收集器的协同工作

通过合理运用现代C++的内存管理工具,开发者可以在保持性能优势的同时,大幅提高代码的安全性和可维护性。智能指针不是要完全取代new/delete,而是为资源管理提供了更高层次的抽象,让开发者能更专注于业务逻辑的实现。