先日、動的に割り当てられた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のベクトルを使用したままにする必要がありますか?