[英]Is this way of using std::string safe?
我正在写一个包装(有)std :: string的字符串类(Utf8String)(因为它很方便)。
由于某种原因,我必须访问包装的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。
来自http://en.cppreference.com/w/cpp/string/basic_string/c_str :
写入通过c_str()访问的字符数组是未定义的行为。 你不应该那样做。
安全代码:
Utf8String sMessage;
std::array<char, 1024> buffer;
uint32_t nRealLen = some_c_function_write_to_buffer( buffer.data(), buffer.size() );
sMessage.Assign(sBuffer.begin(), sBuffer.end());
最后一行假设您在字符串类中:
template<typename InIt>
void Assign(InIt begin, InIt end) {
m_sBuf.assign(begin, end);
}
(或同等学历)。
这样比较好,因为它不使用对c_str返回的数据的访问,也不尝试手动管理std :: string中的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.