第二十五课:C++中的资源管理与智能指针
学习目标:
- 理解动态内存管理的原理与实践。
- 掌握智能指针的概念、用途及其在动态内存管理中的应用。
学习内容:
-
动态内存管理基础:
- C++程序在运行时分配的内存主要分为两种:自动存储(如局部变量)和动态存储(使用动态内存分配)。
- 使用new操作符可以在堆上分配内存,它返回指向新分配类型的指针。使用delete操作符释放由new分配的内存。
int* ptr = new int; // 分配单个整数 *ptr = 5; // 给分配的整数赋值 delete ptr; // 释放内存 ptr = nullptr; // 将ptr设置为nullptr,防止悬空指针
- 对于数组的动态分配,使用带有方括号的new和delete。
int* array = new int[10]; // 分配10个整数的数组 delete[] array; // 释放整个数组
- 动态内存管理的问题:
- 内存泄漏:忘记释放内存导致程序占用越来越多的内存。
- 悬空指针:释放内存后继续使用原来的指针。
- 双重删除:对同一个内存地址调用两次delete。
-
智能指针简介:
- 智能指针是一种对象,它像常规指针一样使用,但会在适当的时候自动释放它所管理的资源。这些指针是模板类,定义在
头文件中。 -
std::unique_ptr:
- std::unique_ptr提供了独占的内存所有权模型。一旦std::unique_ptr对象被销毁,它所指向的对象也会被自动销毁。
- std::unique_ptr不支持拷贝和赋值,确保同一时间只有一个unique_ptr指向特定资源。
- 通常使用std::make_unique函数创建std::unique_ptr实例。
std::unique_ptr
uptr = std::make_unique (10); // 使用make_unique -
std::shared_ptr:
- std::shared_ptr使用引用计数机制来确保多个指针可以共享同一资源的所有权。
- 当最后一个shared_ptr被销毁时,资源会被自动释放。
- 通常使用std::make_shared函数创建std::shared_ptr实例。
std::shared_ptr
sptr = std::make_shared (20); // 使用make_shared -
std::weak_ptr:
- std::weak_ptr设计用来解决std::shared_ptr可能导致的循环引用问题。
- std::weak_ptr不控制对象的生命周期,在需要时通过调用lock方法尝试获取std::shared_ptr来访问资源。
std::weak_ptr
wptr = sptr; // sptr是一个shared_ptr if (std::shared_ptr sptr_locked = wptr.lock()) { // 使用sptr_locked访问资源 } else { // 资源已经被释放 }
- 智能指针是一种对象,它像常规指针一样使用,但会在适当的时候自动释放它所管理的资源。这些指针是模板类,定义在
- 动态内存管理的问题:
- 对于数组的动态分配,使用带有方括号的new和delete。
练习题:
编写一个程序,创建一个std::shared_ptr管理的int数组。使用std::shared_ptr和std::weak_ptr演示资源共享和弱引用的概念。
#include
#include int main() { // 创建一个shared_ptr管理的int数组 std::shared_ptr sptr(new int[3]{1, 2, 3}, std::default_delete ()); // 创建一个weak_ptr指向同一个数组 std::weak_ptr wptr(sptr); // 使用lock()尝试获取一个shared_ptr if (auto shared = wptr.lock()) { for (int i = 0; i < 3; ++i) { std::cout << shared[i] << ' '; } std::cout << '\n'; } else { std::cout << "资源已释放。\n"; } // shared_ptr离开作用域,数组被自动释放 return 0; } // 预计输出效果 // 1 2 3 答案解析:
本练习中,我们首先创建了一个由std::shared_ptr管理的整数数组。然后,我们创建了一个std::weak_ptr,指向相同的数组。通过lock方法尝试获取std::shared_ptr,如果资源仍然存在,我们输出数组的内容。当最后一个std::shared_ptr被销毁时,数组资源也会被自动释放。
目录
第二十六课:理解C++中的Lambda表达式
-
猜你喜欢
- 10天前(天气预报 华为)2025HDC华为天气上新系统级天气智能体,引领更智能的气象服务
- 10天前(“清透会呼吸”轻松拿捏春日出游氛围感)“清透会呼吸”轻松拿捏春日出游氛围感
- 10天前(岭南东方大酒店)粤西成势 | 阳江阳春长兴岭南东方酒店正式签约,粤西文旅再添明珠
- 10天前(上海迪士尼 夏天)酷爽夏日,奇妙相伴!来上海迪士尼度假区清凉入夏
- 10天前(“百场黄梅唱响百家景区”示范演出活动在黄山风景区举行)“百场黄梅唱响百家景区”示范演出活动在黄山风景区举行
- 10天前(殷建祥简历)全国十大牛商解码:殷建祥如何用178天技术突围打造星空梦星空房
- 10天前(新西兰旅游局×时差岛:黄觉的“长白云之乡”奇遇)新西兰旅游局×时差岛:黄觉的“长白云之乡”奇遇
- 10天前(锦江 iu)锦江荟APP原生鸿蒙版正式上线打造全场景旅行服务新体验
- 10天前(泸沽湖大酒店地址)泸沽湖岚岳酒店盛大开业|以摩梭文化为魂,打造高端度假新地标
- 10天前(我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章