Безопасно ли брать адрес внутреннего указателя std :: wstring? - PullRequest
0 голосов
/ 13 июня 2010

У меня есть интерфейс, который используется следующим образом:

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" из-за нуля в середине.

1 Ответ

4 голосов
/ 13 июня 2010

Как указывает АраК, хранилище строк может быть не непрерывным, хотя это маловероятно.Вы также можете использовать вектор:

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
    }
}

, который, скорее всего, безопасен для исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...