基于wchar_t*的向量的奇怪行为

Strange behaviour with wchar_t* based vector

本文关键字:向量 基于 wchar      更新时间:2023-10-16

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

#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中的所有项都会被覆盖。也就是说,所有的向量项都包含相同的值。

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

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

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