繁体   English   中英

这样使用std :: string安全吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM