gpt4 book ai didi

c++ - 构建 LPWSTR 的更安全方法

转载 作者:行者123 更新时间:2023-11-30 01:40:49 25 4
gpt4 key购买 nike

我正在使用 WinAPI GetLogicalDriveStrings() 需要 LPWSTR 的函数并且想知道是否有更安全的方法来确保没有内存泄漏。

目前我构造了一个指向缓冲区的初始指针 buf使用:

auto buf = GetLogicalDriveStrings(0, nullptr);

然后我创建了 LPWSTR 来代替我实际调用中的空指针,使用:

auto driveStrings = static_cast<LPWSTR>(malloc((buf + 1) * sizeof(WCHAR)));

接下来我创建一个指向 driveStrings 的指针稍后释放它。检查后是否 driveStrings是一个空指针,或者如果缓冲区(buf)是NULL (以防无法分配内存),我调用 GetLogicalDriveStrings()使用 driveStrings .

得到结果后,我手动 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> ,我不知道如何将每个元素转换为 GetDriveType() 的 LPCWSTR .

这可以正常工作,但是有没有更好/更安全的方法来做到这一点?我愿意接受任何和所有的改进。

最佳答案

我想我会做这样的事情:

std::wstring s(buf+1, '\0');

auto len = GetLogicalDriveStrings(buf, &s[0]);
s.resize(len);

这会创建一个包含 NUL 的 wstring,然后 GetLogicalDriveStrings 会用它生成的内容覆盖内容。最后,我们将字符串的大小调整为 GetLogicalDriveStrings 实际写入的字符数。

从那里,我们有一个完全正常的字符串,当它超出范围时,它将释放它的内存,就像任何其他字符串一样。

关于c++ - 构建 LPWSTR 的更安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42585906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com