3 回答

TA貢獻1796條經驗 獲得超4個贊
函數返回的值對象是臨時的。的結果c_str()僅在臨時生存期內有效。在大多數情況下,臨時項的生存期到完整表達式的結尾(通常是分號)。
const char *p = SomeFunction();
printf("%s\n", p); // p points to invalid memory here.
解決方法是確保c_str()在完整表達式結束之前使用的結果。
#include <cstring>
char *strdup(const char *src_str) noexcept {
char *new_str = new char[std::strlen(src_str) + 1];
std::strcpy(new_str, src_str);
return new_str;
}
const char *p = strdup(SomeFunction.c_str());
請注意,這strdup是POSIX函數,因此,如果您是支持POSIX的平臺,那么它已經存在。

TA貢獻1824條經驗 獲得超5個贊
的“
string str
”在方法SomeFunction()
是在一個局部變量SomeFunction()
,和僅存活的范圍內SomeFunction()
;由于該方法的返回類型
SomeFunction()
是字符串,而不是字符串的引用,因此在“return str;
”之后SomeFunction()
將返回的值的副本,該副本str
將作為臨時值存儲在內存中的某個位置,在調用后SomeFunction()
,該臨時價值將立即被銷毀;“
string str = SomeFunction();
”將存儲返回SomeFunction()
到字符串的臨時值str
,實際上是該值的副本并存儲到str
,分配了一個新的存儲塊,并且“ ”的調用后的生存期str
大于返回的臨時值。完成后,返回的臨時值立即被銷毀,內存由系統回收,但此值的副本仍存儲在中。這就是為什么“ ”可以獲取正確的值,實際上返回的是初始元素的指針(指向的字符串值的第一個元素存儲地址),而不是返回的臨時值;SomeFunction()
;
SomeFunction()
str
const char* strConverted = str.c_str();
c_str()
str
str
SomeFunction()
“
const char* charArray= SomeFunction().c_str();
”是不同的,“SomeFunction().c_str()
”將返回返回的臨時值的初始元素的指針(返回的臨時字符串值的第一個元素內存地址),但是在調用之后SomeFunction()
,返回的臨時值被破壞,并且該內存地址由系統重用,charArray
可以獲取該內存地址的值,但不能獲取您期望的值;
- 3 回答
- 0 關注
- 765 瀏覽
添加回答
舉報