首页 > 系统相关 >SHBrowseForFolder 内存泄露

SHBrowseForFolder 内存泄露

时间:2024-11-11 13:08:49浏览次数:1  
标签:std CoTaskMemFree pidl SHBrowseForFolder 内存 include 泄露

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;
}

标签:std,CoTaskMemFree,pidl,SHBrowseForFolder,内存,include,泄露
From: https://www.cnblogs.com/DreamTalk/p/18539485

相关文章

  • 内存可见性问题及synchronized的作用
    内存可见性问题在多线程编程中,内存可见性是一个关键问题。内存可见性问题指的是当多个线程访问同一个变量时,一个线程对变量的修改对其他线程不可见。这通常是由于缓存和线程内部的局部变量导致的。synchronized与内存可见性synchronized关键字在Java中不仅保证了临界区内最......
  • 千兆反射内存卡的技术原理与优势
    在当今数字化的快节奏世界中,数据的快速、准确和实时传输已成为各行各业成功的关键。反射内存卡,作为一种尖端的数据传输解决方案,以其独特的性能和广泛的应用前景,正在引领行业的变革。本文将深入探讨千兆反射内存卡的应用领域及其发展前景,揭示这一技术如何为各行各业带来前所未有......
  • .NET 中的虚拟内存
    在.Net中,虚拟内存是由操作系统管理的地址空间,允许应用程序在可用物理内存(RAM)之上分配和使用更多的内存。C#程序(或.NET程序)运行在.NET公共语言运行时(CLR)上,CLR会利用虚拟内存来分配和管理对象,但具体的虚拟内存分配与管理则由操作系统来处理。C#和.NET中的虚拟内存概念......
  • C++中的RAII与内存管理
    C++中的RAII与内存管理引言资源获取即初始化(ResourceAcquisitionIsInitialization,简称RAII)是C++编程中一种重要的编程范式,它通过对象生命周期来管理资源,确保资源在不再需要时能够被正确释放。本文将从C++的内存布局入手,逐步深入到栈区、堆区的概念,new和delete的操作原理,最终......
  • C++17 多态内存管理 pmr
    C++17多态内存管理pmr概念C++17开始,增加特性PolymorphicMemoryResources多态内存资源,缩写PMR。提供新的内存分配策略,更灵活地控制内存的分配与回收——适用于嵌入式和高并发服务器场景。对内存资源的抽象抽象基类std::pmr::memory_resource定义了用于内存的分......
  • STM32的内存(堆和栈)
    一般来说单片机的内存指的是FLASH和RAM,当在程序中定义了全局变量、局部变量、只读变量等参数时都是会存放到对应的FLASH或者是RAM中。具体对单片机FLASH和RAM的介绍之后再写,这里只对单片机内存分配,对堆和栈以及变量的存储做一个梳理和记录。1、FLASH(0x08000000)FLASH主要是存放......
  • 动态内存2
    今天我们来介绍一下剩下的两个函数,calloc函数和realloc函数,现在我们就来学习。1.calloc函数这个函数跟malloc函数的用法大致相同,唯一区别就是calloc函数在申请空间后会帮你把每个字节初始化为0。 2.realloc函数这个函数让动态内存管理更加灵活。这个函数可以实现内存大小......
  • 动态内存(c)
    大家好,今天我们就来聊聊c语言中动态内存的一些知识,相信大家很多时候在申请空间时总会有空间不够用或者太大用不完的情况吧,这个时候使用动态内存就是一个不错的选择,下面我们便来了解一下。1.malloc函数这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,注意并不......
  • 程序的内存模型
    内存分区模型C++程序在执行时,将内存大致分为4个区域。1.代码区:存放函数体的二进制代码,由操作系统进行管理。2.全局区:存放全局变量和静态变量以及常量。3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统......
  • 内存管理-41-highatomic预留内存
    基于msm-5.4一、相关结构体1.structzonestructzone{unsignedlongnr_reserved_highatomic;...};成员介绍:nr_reserved_highatomic:记录为高优先级原子分配预留的内存页面数量。二、赋值逻辑赋值路径只有两个,一个是对高阶原子分配进行页面预留,另一个是减......