Почему происходит утечка памяти в SHGetFolderPath ()? (C ++)

Я использую Intel Inspector для обнаружения утечек памяти в приложении.
Теперь дело обстоит так: предположим, что есть функция MyGetPath (), которая выполняет следующие действия:

_TCHAR szFolderPath[520] =_T("");
SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES,NULL,NULL,szFolderPath);
return _T("MemLeak");

Когда я запускаю Intel Inspector, он сообщает об утечке на 40 байт, а сайт выделения — это строка SHGetFolderPath. Но почему есть утечка, и как ее избежать?

1

Решение

Я написал очень простую программу, чтобы поэкспериментировать с ней и с Deleaker чтобы найти, какие утечки могут произойти здесь:

#include <tchar.h>
#include <windows.h>
#include <Shlobj.h>

int _tmain(int argc, _TCHAR* argv[])
{
DebugBreak(); // I take snapshot here

_TCHAR szFolderPath[520] = _T("");
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);

// Then I take snapshot here
// and compare with previous one
DebugBreak();

SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);

// Finally I take snapshot here
// and compare with previous one
DebugBreak();

return 0;
}

Как видите, я делаю 3 снимка.

Я сделал первый снимок и получил несколько выделений:

снимок № 1

Затем я делаю второй снимок и вычисляю разницу между ним и предыдущим снимком, чтобы посмотреть, что было выделено SHGetFolderPath. Действительно, были сделаны некоторые ассигнования:

снимок № 2

На самом деле я подозревал, что это однократное распределение, и это правда: я снова вызываю SHGetFolderPath, делаю новый снимок и сравниваю его с предыдущим. Нет новых распределений:

снимок № 3

Я сделал еще один эксперимент, чтобы быть абсолютно уверенным. Просто запустите бесконечный цикл и проверьте использование памяти в диспетчере задач:

while (true)
{
_TCHAR szFolderPath[520] = _T("");
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szFolderPath);
}

Использование памяти кажется стабильным.

Поэтому я думаю, что вам не нужно заботиться об этой маленькой утечке.

3

Другие решения


По вопросам рекламы [email protected]