WString 实现 - 返回以 null 结尾,我走的路是否正确



我有一个自己的不可变的wstring实现,但是在实际使用它时遇到了问题。当我需要 wchar 数组时,我需要它以 null 结尾,所以我这样做:

wchar* String::CStr() const
{
    wchar* temp = new wchar[size + 1];
    for(int i = 0; i < size; i++)
    {
        temp[i] = data[i];
    }
    temp[size] = L'';
    return(temp);
}
Now this is good and all, but I have no way of releasing the newly created wchar array, so there's a memory leak each time CStr() is used.So instead I tried using an automatic pointer to fix it:
Auto<wchar> String::CStr() const
{
    wchar* temp = new wchar[size + 1];
    for(int i = 0; i < size; i++)
    {
        temp[i] = data[i];
    }
    temp[size] = L'';
    return(Auto<wchar>(temp));
}

Auto 只是存储 wchar* 并将其删除在析构函数中。当然,它根本不起作用,因为 Auto<> 在函数结束时死亡,所以我得到一个空的 wchar*。此外,由于 Auto<> 有一个析构函数,因此此方法永远不会内联。所以我完全错误的方向。我尝试查看 std::wstring 源代码,但是它对所有内部 typedef 都非常不可读,我注意到的是它不仅存储了像我的 wchar* 数据这样的东西,而且还存储了一个我假设是 jut 1 字符的 wchar*(空终止符):

_Elem *_Myptr;  // pointer to allocated string
_Elem _Nul;     // nul terminator for unallocated string

但是,它并不在方法中可靠地使用 _Nul,它只返回_Myptr:

const _Elem *__CLR_OR_THIS_CALL c_str() const
    {   // return NTBS
    return (_Myptr != 0 ? _Myptr : &_Nul);
    }

但是,我看不到_Myptr在返回之前在哪里被null终止?还是他们只是在原始状态下将其扔掉?

您可以将以

空结尾的字符串存储在data数组中,并将其作为const wchar *返回。它将消除不必要的数据复制。

编辑:

关于您提到的 wstring 源中的额外 wchar 指针。它可能是 end() 指针。该实现分配了一些存储字符串的数据缓冲区,但分配的缓冲区大于字符串,因此它存储指向缓冲区开头(数据)的指针和指向数据结尾(指向 '' wchar)的指针。这样,size()函数可以很容易地实现为int size() const{ return end_ptr-data; },即使 wstring 本身包含也可以工作。

_Myptr以

null 结尾,因此当 c_str 返回 _Myptr 时无需添加终止符。

相关内容

  • 没有找到相关文章

最新更新