我使用的WinAPI GetLogicalDriveStrings()
函数需要LPWSTR
,并且想知道是否有更安全的方法来确保没有内存泄漏。更安全的构建LPWSTR的方法
目前我构建初始指向缓冲区buf
使用:
auto buf = GetLogicalDriveStrings(0, nullptr);
然后,我创建使用作为代替空指针在我的实际通话所用的LPWSTR:
auto driveStrings = static_cast<LPWSTR>(malloc((buf + 1) * sizeof(WCHAR)));
接下来,我创建一个指向driveStrings
的指针,稍后将其释放。在检查driveStrings
是空指针还是缓冲区(buf
)为NULL
(在无法分配内存的情况下)后,我使用driveStrings
调用GetLogicalDriveStrings()
。
当我得到结果我手动free()
LPWSTR使用我分配它后指针。
我该如何使用LPWSTR的智能指针,所以我不必使用malloc()
和free()
,但它仍然可以与GetLogicalDriveStrings()
函数一起使用?
工作的最小值例如:
auto buf = GetLogicalDriveStrings(0, nullptr);
auto driveStrings = static_cast<LPWSTR>(malloc((buf + 1) * sizeof(WCHAR)));
auto pDriveStrings = driveStrings;
if (driveStrings == nullptr || buf == NULL)
{
std::stringstream msg;
msg << "Can't allocate memory for drive list: ";
msg << GetLastError();
throw std::runtime_error(msg.str());
}
// get drive strings
if (GetLogicalDriveStrings(buf, driveStrings) == NULL)
{
std::stringstream msg;
msg << "GetLogicalDriveStrings error: ";
msg << GetLastError();
throw std::runtime_error(msg.str());
}
// iterate over results
while (*driveStrings)
{
// GetDriveType() requires a LPCWSTR
if (GetDriveType(driveStrings) == DRIVE_FIXED || GetDriveType(driveStrings) == DRIVE_REMOVABLE)
{
std::wcout << driveStrings << std::endl;
}
driveStrings += lstrlen(driveStrings) + 1;
}
free(pDriveStrings);
如果我使用一个std::wstring
,我无法弄清楚如何通过在driveStrings
缓冲每个字符串进行迭代。如果我使用std::vector<WCHAR>
,我无法弄清楚如何将每个元素投射到LPCWSTR的GetDriveType()
。
这工作正常,但有没有更好/更安全的方式来做到这一点?我愿意接受任何改进。
'的std ::矢量缓冲器(BUF + 1);'' –
IInspectable
的std :: wstring'也是安全的在C++ 11如果使用得当。 – chris
无论如何,代码都有问题。在你打电话给'free()'之前,你正在使用'malloc',并且可能会抛出''''。 – PaulMcKenzie