使用vector <wchar>而不是动态分配的wchar数组</wchar>

时间:2011-04-18 11:44:47

标签: c++ stdvector

前几天,我被告知(在stackoverflow上!)因为没有使用vector而不是动态分配的wchar数组。

所以我看一下使用这种字符串操作方法,因为防止可能的内存泄漏似乎是一个好主意。

我想到的是,除非我错误地使用向量模板类,否则使用向量比使用堆分配的数组和旧的memcpy要灵活得多。

#include <shlobj.h>
HRESULT ModifyTheme()
{
using namespace std;

vector <WCHAR>  sOutput;
vector <WCHAR>  sPath;      
vector <WCHAR>  sThemesLocation;
vector <WCHAR>  sThemeName; 

const WCHAR sThemesPath []  = _T("\\Microsoft\\Windows\\Themes");
const WCHAR sFileName []    = _T("\\darkblue.theme");

sOutput.resize(MAX_PATH);
sPath.resize( MAX_PATH );   
sThemesLocation.resize( MAX_PATH );
sThemeName.resize( MAX_PATH );

// Get appdata\local folder
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, &sPath[0] );

// copy consts to vectors   
memcpy( &sThemesLocation[0],    sThemesPath,    sizeof(sThemesPath) );
memcpy( &sThemeName[0],         sFileName,      sizeof(sFileName) );    

// append themes path & filename
sOutput.insert( sOutput.begin(), sPath.begin(), sPath.end() );
sOutput.insert( sOutput.end()-1, sThemesLocation.begin(), sThemesLocation.end() );
sOutput.insert( sOutput.end()-1, sThemeName.begin(), sThemeName.end() );    

wcout << &sThemeName[0] << endl;
wcout << &sThemesLocation[0] << endl;
wcout << &sPath[0] << endl;
wcout << &sOutput[0] << endl;

return S_OK;
}

我希望sOutput向量包含所有字符串的串联。相反,它只包含第一个插入的字符串。

另外,我想我记得虽然不可能在初始化列表中分配向量的值,但它可能是c ++ 0x的一个特性。这是否正确 - 是否有任何方式(在一分钟内)执行以下操作:

vector<wchar> sBleh = { _T("bleh") };

最后,对于我想用上面的简单例程实现的目标,使用动态分配的数组会更好吗,还是应该坚持使用看似不灵活的wchar向量?

2 个答案:

答案 0 :(得分:4)

如果您使用std::vector<WCHAR>,则应该使用std::wstring,因为它也是WCHAR元素的容器。

以下链接可能对您有所帮助:
std::wstringstd::basic_string<WCHAR>的typedef)
std::basic_string

答案 1 :(得分:1)

使用最佳工具完成工作。有些情况需要使用静态数组,有些需要动态数组。当情况需要动态数组时,请使用向量。

Mark Ingram是正确的,您可以使用wstring,但前提是wchar_t与WCHAR的大小相同。

这样的东西对你想要的东西更好(注意,我没有通过编译器运行下面的代码,因为有太多微软特定的构造。):

WCHAR sPath[MAX_PATH]; // doesn't need to be a dynamic array, so don't bother with a vector.
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, &sPath[0] );

const WCHAR sThemesPath[] = _T("\\Microsoft\\Windows\\Themes"); // doesn't need to be a dynamic array, so don't bother with a vector.
const WCHAR sFileName[] = _T("\\darkblue.theme"); // doesn't need to be a dynamic array, so don't bother with a vector.
vector<WCHAR> sOutput; // this needs to be dynamic so use a vector.

// wcslen should probably be replaced with an MS specific call that gets the length of a WCHAR string
copy(sPath, sPath + wcslen(sPath), back_inserter(sOutput));
copy(sThemesPath, sThemesPath + wcslen(sThemesPath), back_inserter(sOutput));
copy(sFlieName, sFileName + wcslen(sFileName), back_inserter(sOutput));