我正在写一个字符串类(Utf8String)包装(有)一个std ::字符串(因为它很方便)。这种方式使用std :: string安全吗?
出于某种原因,我必须访问包装的std :: string的内部缓冲区才能直接写入它。我知道这是肮脏的,反对封装原则和所有这些,但我必须这样做。
让下面的UTF8字符串类成员:
std::basic_string<char> m_sBuf;
inline char * Reserve(uint32_t nNewByteCap)
{
m_sBuf.reserve(nNewByteCap);
return const_cast< char * >(m_sBuf.c_str());
}
inline void Resize(uint32_t nNewByteCount)
{
// Some stuff ...
m_sBuf.resize(nNewByteCount, ' ');
}
为了做这样的事情:
Utf8String sMessage;
char * sBuffer = sMessage.Reserve(1024);
uint32_t nRealLen = some_c_function_write_to_buffer(sBuffer, sMessage.Capacity());
sMessage.Resize(nRealLen);
我不能肯定STL的内部工作原理。据我所知,它接受在std :: string中间丢失空字符,因此在字符串实际结束之前放置一个空字符应该不成问题。
由于STL的实现在不同的平台上可能会有所不同,我的测试并不意味着它也可以在其他平台上运行。
你看到这段代码中可以破坏我使用的std :: string对象的东西吗?谢谢你的帮助。
PS:我不能使用C++ 11。
您对“reserve”和“resize”的使用没有任何规定是合法的。无论容量如何,写在字符串的* size *之外的行为都有未定义的行为。 –
你是否声明'返回m_sBuf.c_str();'在函数返回'char *'even * compiles *? – WhozCraig
@KerrekSB我知道这不是使用std :: string的正确方法,这就是为什么我问,因为我怀疑会有问题。如果我使用的是调整大小而不是保留? WhozCraig我为这个问题写了这段代码,我只是忘了const_cast <>,但那不是重点。 – Virus721