У меня есть интерфейс, который используется следующим образом:
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
}
}
Теперь, очевидно, это работает (не разрушает / не портит память), иначе я бы не спросил, но я в основном хочу знать, есть ли веская причина не делать этого. 1009 *
Редактировать: На самом деле я изменил это на .resize (размер-1), так как, очевидно, нулевой символ для вас учтен (в любом случае VS 2010). Использование .resize (размер) закончилось тем, что добавление к концу строки привело к:
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" из-за нуля в середине.