C++ 使用向量<;wchar>;而不是动态分配的wchar数组

C++ 使用向量<;wchar>;而不是动态分配的wchar数组,c++,stdvector,C++,Stdvector,前几天,我(在stackoverflow上)因为没有使用vector而不是动态分配的wchar数组而被训斥 因此,我研究了使用这种字符串操作方法,因为这似乎是一个防止可能的内存泄漏的好主意 我想到的是,除非我错误地使用vector模板类,否则使用vector比使用堆分配数组和好的旧memcpy灵活得多 #include <shlobj.h> HRESULT ModifyTheme() { using namespace std; vector <WCHAR> sOut

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

因此,我研究了使用这种字符串操作方法,因为这似乎是一个防止可能的内存泄漏的好主意

我想到的是,除非我错误地使用vector模板类,否则使用vector比使用堆分配数组和好的旧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;
}
#包括
HRESULT ModifyTheme()
{
使用名称空间std;
矢量输出;
矢量sPath;
矢量定位;
向量名;
常量WCHAR sThemesPath[]=“Microsoft\\Windows\\Themes”);
常量WCHAR sFileName[]=\u T(\\darkblue.theme”);
sOutput.resize(最大路径);
调整大小(最大路径);
调整大小(最大路径);
sTimeName.resize(最大路径);
//获取appdata\local文件夹
SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,0,&sPath[0]);
//将常量复制到向量
memcpy(&sThemesLocation[0],sThemesPath,sizeof(sThemesPath));
memcpy(&sThemeName[0],sFileName,sizeof(sFileName));
//附加主题路径和文件名
插入(sOutput.begin(),sPath.begin(),sPath.end());
插入(sOutput.end()-1,sThemesLocation.begin(),sThemesLocation.end());
插入(sOutput.end()-1,sThemeName.begin(),sThemeName.end());

wcout如果您使用的是
std::vector
您可能应该使用
std::wstring
,因为它也是
WCHAR
元素的容器

以下链接可能对您有所帮助:
(标准的typedef::基本字符串


如果您使用的是
std::vector
,您可能应该使用
std::wstring
,因为它也是
WCHAR
元素的容器

以下链接可能对您有所帮助:
(标准的typedef::基本字符串)

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

Mark Ingram认为可以使用wstring是正确的,但前提是wchar\u t的大小与wchar相同

这样做更符合您的需要(注意,我没有通过编译器运行下面的内容,因为有太多Microsoft特定的构造):

WCHAR sPath[MAX_PATH];//不需要是动态数组,所以不必麻烦使用向量。
SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,0,&sPath[0]);
const-WCHAR-sThemesPath[]=\u T(“\\Microsoft\\Windows\\Themes”);//不需要是动态数组,因此不必使用向量。
const WCHAR sFileName[]=\u T(“\\darkblue.theme”);//不需要是动态数组,所以不必麻烦使用向量。
vector sOutput;//这需要是动态的,所以请使用向量。
//wcslen可能应该替换为获取WCHAR字符串长度的MS特定调用
复制(sPath、sPath+wcslen(sPath)、背面插入器(sOutput));
复制(sThemesPath、sThemesPath+wcslen(sThemesPath)、back_插入器(sOutput));
复制(sFlieName、sFileName+wcslen(sFileName)、back_插入器(sOutput));

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

Mark Ingram认为可以使用wstring是正确的,但前提是wchar\u t的大小与wchar相同

这样做更符合您的需要(注意,我没有通过编译器运行下面的内容,因为有太多Microsoft特定的构造):

WCHAR sPath[MAX_PATH];//不需要是动态数组,所以不必麻烦使用向量。
SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,0,&sPath[0]);
const-WCHAR-sThemesPath[]=\u T(“\\Microsoft\\Windows\\Themes”);//不需要是动态数组,因此不必使用向量。
const WCHAR sFileName[]=\u T(“\\darkblue.theme”);//不需要是动态数组,所以不必麻烦使用向量。
vector sOutput;//这需要是动态的,所以请使用向量。
//wcslen可能应该替换为获取WCHAR字符串长度的MS特定调用
复制(sPath、sPath+wcslen(sPath)、背面插入器(sOutput));
复制(sThemesPath、sThemesPath+wcslen(sThemesPath)、back_插入器(sOutput));
复制(sFlieName、sFileName+wcslen(sFileName)、back_插入器(sOutput));

您可以尝试
std::wstring
wcout您可以尝试
std::wstring
wcout
vector<wchar> sBleh = { _T("bleh") };
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));