【发布时间】:2015-05-29 08:23:50
【问题描述】:
我正在编写一个字符串类(Utf8String),它包装(具有)一个 std::string(因为它很方便)。
出于某种原因,我必须访问包装的 std::string 的内部缓冲区才能直接写入其中。我知道这是肮脏的,违反了封装原则等等,但我必须这样做。
让下面的 Utf8String 类成员:
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 的写入具有未定义的行为,无论容量如何。 -
你是否在一个返回
char *的函数中声明return m_sBuf.c_str();,甚至编译? -
@KerrekSB 我知道这不是使用 std::string 的正确方法,这就是我问的原因,因为我怀疑会有问题。如果我使用调整大小而不是保留怎么办? WhozCraig 我为这个问题编写了这段代码,我只是忘记了 const_cast,但这并不是重点。