我有一个如下所示的界面:
if (SUCCEEDED(pInterface->GetSize(&size))
{
wchar_t tmp = new wchar_t[size];
if (SUCCEEDED(pInterface->GetValue(tmp, size)))
{
std::wstring str = tmp;
// do some work which doesn't throw
}
delete[] tmp;
}
这样做是否安全且便携?
if (SUCCEEDED(pInterface->GetSize(&size))
{
std::wstring str;
str.resize(size-1);
if (SUCCEEDED(pInterface->GetValue(&str[0], size)))
{
// do some work
}
}
现在,显然这个工作(不会崩溃/损坏内存)或者我不会问,但我主要想知道是否有令人信服的理由不这样做。
编辑:实际上我已经将此更改为.resize(size-1),因为显然您考虑了空字符(无论如何都是VS 2010)。使用.resize(size)结束了追加到字符串末尾的结果:
str.resize(size);
pInterface->GetValue(&str[0], size);
str contains L"foo\0";
str += L"bar";
str contains L"foo\0bar";
由于中间的空值,尝试使用生成的str.c_str最终看起来像L“foo”。
答案 0 :(得分:4)
正如AraK指出的那样,字符串存储可能不是连续的,尽管这不太可能。您还可以考虑使用向量:
if (SUCCEEDED(pInterface->GetSize(&size))
{
std::vector <wchar_t> vtmp( size );
if (SUCCEEDED(pInterface->GetValue( & vtmp[0], size)))
{
std::wstring str = & vtmp[0];
// or maybe don't bother with the string - just use the vector
}
}
更有可能是例外安全。