获取std :: wstring的内部指针的地址是否安全?

时间:2010-06-12 20:18:31

标签: c++ stl

我有一个如下所示的界面:

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”。

1 个答案:

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

更有可能是例外安全。