c++ - 基于 wchar_t* 的 vector 的奇怪行为

标签 c++ winapi vector stl

我正在开发一个小函数,它遍历一个目录并将所有文件的名称放入一个基于 wchar_t* 的 vector 中:

#include <Windows.h>
#include <tchar.h>
#include <vector>

#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA ffd;

    std::wstring sDir(L"D:\\Test");
    sDir += L"\\*"; 

    HANDLE hFind = INVALID_HANDLE_VALUE;
    hFind = FindFirstFile(sDir.c_str(), &ffd);

    std::vector<wchar_t*> vctsFiles;
    wchar_t szBuf[MAX_PATH];

    do
    {
        if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
            memset(szBuf, 0, sizeof(szBuf));
            ::PathCombine(szBuf, L"D:\\Test", ffd.cFileName);
            vctsFiles.push_back(szBuf);
        }

    } while(FindNextFile(hFind, &ffd) != 0);

    return 0;
}

问题是一旦附加了新文件名, vector 中的所有条目都会被覆盖。换句话说,所有 vector 条目都将包含相同的值。

我不太确定为什么会这样,因为我总是在将缓冲区用于新条目之前清除缓冲区。有没有办法纠正这种行为?如有任何建议,我们将不胜感激。

最佳答案

你的 vector 是一个指针 vector ,它们都指向同一个地方(szBuf)。您需要每次都分配一个新的 szBuf,或者更好的是,使用一个 wstring vector 。

std::vector<std::wstring> vctsFiles;

关于c++ - 基于 wchar_t* 的 vector 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25390352/

相关文章:

c++ - 如何从脱敏的 GtkWidget - GtkSpinButton 中清除焦点,属性为 sensitive = false

c - 一次 Hook DLL 初始化

c++ - 创建最小化重叠窗口 (Win32)

delphi - 如何从 DLL 返回实例?

haskell 。在 O(1) 中更新单个 Vector 元素

c++ - 在 C++ 中使用指针返回二维 vector

c++ - "lvalue"和 "rvalue"命名背后的原因是什么?

c++ - 我应该使用什么 C++ STL 类来减少由大量小分配引起的碎片?

c++ - 如何从 vector 中删除 shared_ptr

c++ - 如何在 Swift for iOS 中使用 C++ 代码