From f75f8f2ce97f80f384455a7e7c1c59bd5ba231ab Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 14 Nov 2024 18:39:54 -0800 Subject: [PATCH] Use a smart pointer to auto-free some WinAPI memory --- utils/alsoft-config/mainwindow.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp index aad35671..d46b677a 100644 --- a/utils/alsoft-config/mainwindow.cpp +++ b/utils/alsoft-config/mainwindow.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -146,19 +147,25 @@ constexpr std::array hrtfModeList{ NameValuePair{ "Full", "full" }, }; +#ifdef Q_OS_WIN32 +struct CoTaskMemDeleter { + void operator()(void *buffer) { CoTaskMemFree(buffer); } +}; +/* NOLINTNEXTLINE(*-avoid-c-arrays) */ +using WCharBufferPtr = std::unique_ptr; +#endif + QString getDefaultConfigName() { #ifdef Q_OS_WIN32 const char *fname{"alsoft.ini"}; - auto get_appdata_path = []() noexcept -> QString + static constexpr auto get_appdata_path = []() -> QString { - QString ret; - WCHAR *buffer{}; + auto buffer = WCharBufferPtr{}; if(const HRESULT hr{SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DONT_UNEXPAND, - nullptr, &buffer)}; SUCCEEDED(hr)) - ret = QString::fromWCharArray(buffer); - CoTaskMemFree(buffer); - return ret; + nullptr, al::out_ptr(buffer))}; SUCCEEDED(hr)) + return QString::fromWCharArray(buffer.get()); + return QString{}; }; QString base = get_appdata_path(); #else @@ -179,15 +186,13 @@ QString getDefaultConfigName() QString getBaseDataPath() { #ifdef Q_OS_WIN32 - auto get_appdata_path = []() noexcept -> QString + static constexpr auto get_appdata_path = []() -> QString { - QString ret; - WCHAR *buffer{}; + auto buffer = WCharBufferPtr{}; if(const HRESULT hr{SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DONT_UNEXPAND, - nullptr, &buffer)}; SUCCEEDED(hr)) - ret = QString::fromWCharArray(buffer); - CoTaskMemFree(buffer); - return ret; + nullptr, al::out_ptr(buffer))}; SUCCEEDED(hr)) + return QString::fromWCharArray(buffer.get()); + return QString{}; }; QString base = get_appdata_path(); #else -- 2.11.4.GIT