我有一个自己的不可变的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 本身包含