我正在寫一個字符串類(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