SHBrowseForFolder 内存泄露

news/2024/11/13 7:30:13/文章来源:https://www.cnblogs.com/DreamTalk/p/18539485

SHBrowseForFolder 函数在执行过程中会动态分配内存来存储与所选文件夹相关的信息,这些信息以 ITEMIDLIST 结构的形式返回。而 SHGetPathFromIDList 函数只是负责从这个 ITEMIDLIST 结构中提取出路径信息并填充到指定的缓冲区中,但它并不会释放 ITEMIDLIST 所占用的内存。为了避免内存泄漏,就需要调用 CoTaskMemFree 函数来显式地释放这块由 SHBrowseForFolder 分配的内存,因为这块内存是通过 COM 任务分配器(CoTaskMemAlloc)分配的,所以需要使用与之对应的 CoTaskMemFree 函数来释放。

出处:https://learn.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nf-shlobj_core-shbrowseforfoldera
调用应用程序负责调用 CoTaskMemFree ,以在不再需要时释放 SHBrowseForFolder 返回的 IDList。

一定要释放PCIDLIST_ABSOLUTE。否则内存泄漏。

 

 

#include "stdafx.h"
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
std::wcout.imbue(std::locale("chs"));
TCHAR szPath[MAX_PATH];
BROWSEINFO bi = { 0 };
bi.lpszTitle = _T("请选择一个文件夹");
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

if (pidl != 0)
{
if (SHGetPathFromIDList(pidl, szPath))
{
std::wcout << _T("你选择的文件夹是: ") << szPath << std::endl;
}
else
{
std::cerr << _T("无法获取文件夹路径。") << std::endl;
}

// 释放内存
CoTaskMemFree(pidl);

std::wcout << _T("你选择的文件夹是: ") << szPath << std::endl;

}
else
{
std::cerr << _T("未选择文件夹。") << std::endl;
}

return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/831747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库设计心得-实习空间

数据库设计心得——实习空间 前言 在软件工程导论以及数据库实验课程中,我们学习了如何通过分析业务需求来构建数据库实体对象以及PowerDesigner的使用。最终通过PowerDesigner完成了本项目的数据库概念模型、物理模型的设计。以下是我们团队的数据库设计过程以及一些心得体会…

智启新篇 | 您的专属AI大模型解决方案!

随着汽车智能化程度的不断提升,智能座舱作为汽车的重要组成部分,其功能和复杂度也在不断增加。从多屏交互、增强现实(AR)技术到个性化设置和语音交互,智能座舱为驾驶者提供了前所未有的驾驶体验。然而,这些新技术的引入也使得智能座舱的测试变得更加复杂和困难。在这样的…

团队作业4——项目冲刺-1

团队作业4——项目冲刺信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 小飞棍团队对需求改进和系统设计进行讨论GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗振烘(组长) 3122004748庄崇立 3122004633李响 3121002802何昌洲 3…

# 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第8周学习总结

学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第8周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个…

XXL-JOB docker 初始化

一、因为xxl-job 使用的是mysq 数据库,所有在 yaml 文件中,需要优先启动 mysql version: 3 services:mysql:image: mysql:8.0container_name: mysql8restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: xxl_jobports:- "3307:3306"xxl-job:im…

深度解读AI在数字档案馆中的创新应用:高效识别与智能档案管理

一、项目背景介绍 在信息化浪潮推动下,基于OCR技术的纸质档案电子化方案成为解决档案管理难题的有效途径。该方案通过先进的OCR技术,能够统一采集各类档案数据,无论是手写文件、打印文件、复古文档还是照片或扫描的历史资料,都能实现高效识别。利用文档智能分析技术,我们对…

2个月搞定计算机二级C语言——真题(11)解析

1. 前言 今天双 11,正好轮到讲第 11 篇,直接来个三 11。 那么本篇我们讲解2个月搞定计算机二级C语言——真题112. 程序填空题 2.1 题目要求2.2 提供的代码 #include <stdio.h> #include <ctype.h> #pragma warning (disable:4996) void fun(int* cd, int* cu…

代码随想录——二叉树-12.平衡二叉树

自顶向下递归(前序遍历)这种方法是一开始想到的,虽然ac了但是对于它的本质却不清不楚,不知道时间复杂度,不知道属于前序遍历。思路 首先得到root节点的左右子树的深度(左右),若深度差绝对值大于1(中),则root为根的树不是平衡二叉树; 否则继续递归root的左右子树,其…

【论文系列】之 ---- CLIP

CLIP(Contrastive Language-Image Pre-Training) 从名字显而易见:语言-图像,预训练,主要用于学习图像 该模型的核心思想是使用大量图像和文本的配对数据进行预训练,以学习图像和文本之间的对齐关系 CLIP模型有两个模态,一个是文本模态,一个是视觉模态,包括两个主要部分…

[极客大挑战 2019]Havefun

页面一只猫,啥东西也没有,直接检查页面源码发现只有输入参数cat==dog就会输出一个值直接拿到flag

代码随想录——二叉树-11.完全二叉树的节点个数

思路 一、层序遍历,时间复杂度O(n) 二、利用完全二叉树性质,时间复杂度O(logn * logn)(小于O(n)) 完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置 完全二叉树要么1.是满二叉树 2.最后一层没满满二叉树计算节点数太方便了,直接用…

Rocky9系统安装PostgreSQL

官网 https://www.postgresql.org/环境查看安装 登录官网根据平台选择帮助文档sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disable postgresql sudo dnf install -y po…