![](/img/trans.png)
[英]Is returning a C++ std::string object safe from memory leaks?
[英]C++: Is it safe to move a jpeg around in memory using a std::string?
我有一個external_jpeg_func()
,它接受一個char數組中的jpeg數據來處理它。 我無法修改此功能。 為了提供char數組,我做了類似下面的事情:
//what the funcs take as inputs
std::string my_get_jpeg();
void external_jpeg_func(const char* buf, unsigned int size);
int main ()
{
std::string myString = my_get_jpeg();
external_jpeg_func(myString.data(), myString.length() );
}
我的問題是:使用字符串傳輸char數組是否安全? jpeg(或者任何二進制文件格式)是否有可能遇到像'\\ 0'這樣的字符並導致數據丟失?
我的建議是在這種情況下使用std::vector<char>
而不是std::string
; std::string
的危險在於它提供了一個c_str()
函數,並且大多數開發人員都認為std::string
的內容是NUL終止的,即使std::string
提供了一個可以返回一個size()
函數與在NUL停留時獲得的價值不同。 也就是說,只要你小心總是使用帶有size參數的構造函數,並且你小心不要將.c_str()
傳遞給任何東西,那么在這里使用字符串沒有問題。
雖然在std::string
上使用std::vector<char>
沒有技術優勢,但我覺得與其他開發人員溝通更好的做法是將內容解釋為任意字節序列而不是NUL終止的文本內容。 因此,我會選擇前者以增加可讀性。 也就是說,我使用了大量使用std::string
存儲任意字節的代碼。 事實上,C ++ 原型編譯器生成了這樣的代碼(但是,我應該補充一點,我認為這不是我提到的可讀性原因的一個好選擇)。
std::string
不會特別處理空字符,除非你沒有給它一個明確的字符串長度。 所以你的代碼會正常工作。
雖然,在C ++ 03中,字符串在技術上不需要存儲在連續的內存中。 幾乎每個std::string
實現都會以這種方式存儲它們,但技術上並不需要它。 C ++ 11糾正了這一點。
所以,我建議你在這種情況下使用std::vector<char>
。 std::string
不會通過std::vector<char>
購買任何東西,而且更明確的是這是一個字符數組而不是可打印的字符串。
我認為最好使用char數組char []或std :: vector <char>。 這是保持圖像的標准方法。 當然,二進制文件可能包含0個字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.