0

先日、動的に割り当てられたwchar配列の代わりにvectorを使用していないことを(stackoverflowで!)言われました。

そこで、メモリリークの可能性を防ぐのは良い考えのように思われるので、この文字列操作の方法を使用することを検討しました。

私が思いついたのは、ベクトルテンプレートクラスを誤って使用していない限り、ベクトルの使用は、ヒープに割り当てられた配列と古き良き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のベクトルを使用したままにする必要がありますか?

4

2 に答える 2

4

使用している場合は、要素のコンテナでもあるため、std::vector<WCHAR>おそらく使用する必要があります。std::wstringWCHAR

次のリンクが役立つ場合があります
。std::wstring(typedef of std::basic_string<WCHAR>
std :: basic_string

于 2011-04-18T11:47:13.930 に答える
1

仕事に最適なツールを使用してください。静的アレイを使用する必要がある状況と、動的アレイを使用する必要がある状況があります。状況が動的配列を必要とする場合は、代わりにベクトルを使用してください。

マーク・イングラムは、wstringを使用できることは正しいですが、wchar_tがWCHARと同じサイズである場合に限ります。

このようなものは、必要なものに適しています(Microsoft固有の構造が多すぎるため、以下をコンパイラーで実行しなかったことに注意してください)。

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));
于 2011-04-18T12:12:28.510 に答える