【问题标题】:Corrupted vector entries with LPCWSTR vector带有 LPCWSTR 向量的损坏的向量条目
【发布时间】:2012-09-16 19:14:56
【问题描述】:

我有以下代码。我得到一个正确填充的向量。但我无法打印或使用来自目录的文件名的矢量内容。一旦我进入第一次迭代。一切都会丢失。我做错了什么?

wprintf - This works OK

wcout-- here is where everything ends up corrupted

#include <windows.h>
#include <sstream>
#include <string>
#include <vector>
#include<iostream>
void GetAllFiles(vector<LPCWSTR>&, wstring);
using namespace std;
void main (void)
{
    vector<LPCWSTR> files(0);
    wstring path = L"Datasets\\Persons\\";
    wstring ext = L"*.*";
    wstring fullPath = path+ext;
    GetAllFiles(files,fullPath);    
    for (unsigned i=0; i<files.size() ; i++)
    {
        try
        {
            wcout<<"::\n"<<files[i];
        }
        catch(exception &ex)
        {
            cout<<"Error:"<<ex.what();
        }
    }

}

void GetAllFiles(vector<LPCWSTR>& fileNames,wstring dir)
{

    WIN32_FIND_DATA search_data;
    memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
    HANDLE handle = FindFirstFile(dir.c_str(),&search_data);
    while(handle != INVALID_HANDLE_VALUE)
    {
        wprintf(L"Found file: %s\r\n", search_data.cFileName);
        fileNames.push_back(search_data.cFileName);
        if(FindNextFile(handle, &search_data) == FALSE)
            break;
    }   
}

我附上了输出的屏幕截图。

【问题讨论】:

    标签: visual-c++ vector iteration corrupt lpcwstr


    【解决方案1】:

    search_data.cFileName是一个指向由FindFirstFile/FindNextFile迭代器接口控制的内存的指针;您不能存储此指针值,因为指向的内存可能会随着迭代而变化(甚至在迭代完成后被释放)。

    相反,您必须复制字符串以放入您的向量中,例如使用wcsdup。更好的是,将您的向量定义为 vector&lt;wstring&gt;,以便 push_back(search_data.cFileName); 使用 search_data.cFileName 的内容创建一个 wstring

    【讨论】:

      【解决方案2】:

      这可能是因为您将局部变量传递给 push_back()。我不确定这里,但这里会发生什么: push_back 需要 LPCWSTR 类型的对象,而您传递的是 char*。我不知道,这种转换是如何完成的,但可能只是复制了指针,当你从函数返回时,这个指针的值变得无效 - 在将字符串传递给 push_back 之前尝试显式复制字符串。

      【讨论】:

      • search_data 可能是一个局部变量,但push_back 按值复制其参数。
      猜你喜欢
      • 1970-01-01
      • 2011-03-30
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多