![](/img/trans.png)
[英]string::c_str() and string::data() not working for conversion to const char*
[英]string and const char* and .c_str()?
我遇到了一個奇怪的問題,我想知道它為什么會這樣。 我有一個類,其中有一個成員函數返回std::string
。 我的目標是將此string
轉換為const char*
,因此我執行了以下操作
const char* c;
c = robot.pose_Str().c_str(); // is this safe??????
udp_slave.sendData(c);
問題是我在Master方面遇到了一個奇怪的角色。 但是,如果我執行以下操作
const char* c;
std::string data(robot.pose_Str());
c = data.c_str();
udp_slave.sendData(c);
我得到了我期待的東西。 我的問題是上述兩種方法之間的區別是什么?
這是一個指向臨時的問題。 如果按值返回但不存儲string
,則它會在下一個序列點(分號)消失。
如果將它存儲在變量中,則指針指向udp發送期間實際存在的內容
考慮以下:
int f() { return 2; }
int*p = &f();
現在看起來很傻,不是嗎? 您指向從f
復制回來的f
。 你不知道它會活多久。
你的string
是一樣的。
.c_str()
按值返回char const*
的地址,這意味着它獲得指針的副本。 但在那之后,它指向的實際字符數組將被銷毀。 這就是你得到垃圾的原因。 在后一種情況下,您將通過從實際位置復制字符來創建具有該字符數組的新字符串。 在這種情況下,雖然實際的字符數組被銷毀,但副本仍保留在字符串對象中。
您不能使用c_str()
指向的數據超過std::string
對象的生命周期。 有時不清楚生命周期是什么,例如下面的代碼。 解決方案還顯示:
#include <string>
#include <cstddef>
#include <cstring>
std::string foo() { return "hello"; }
char *
make_copy(const char *s) {
std::size_t sz = std::strlen(s);
char *p = new char[sz];
std::strcpy(p, s);
return p;
}
int
main() {
const char *p1 = foo().c_str(); // Whoops, can't use p1 after this statement.
const char *p2 = make_copy(foo().c_str()); // Okay, but you have to delete [] when done.
}
來自c_str() :
從c_str()獲得的指針可以通過以下方式無效:
- 將對字符串的非const引用傳遞給任何標准庫函數,或
- 在字符串上調用非const成員函數,不包括operator [],at(),front(),back(),begin(),rbegin(),end()和rend()。
這意味着,如果robot.pose_Str()
返回的字符串被任何非const函數銷毀或更改,則指向該字符串的指針將失效。 由於您可能正在從robot.pose_Str()
返回臨時副本,因此在該調用之后, c_str()
的返回將無效。
但是,如果您返回對您可能持有的內部字符串的引用,而不是臨時副本,您可以:
udp_send
是同步的,請確保它能夠正常工作; udp_send
可能完成,則會遇到未定義的行為。 Q
const char* c;
c = robot.pose_Str().c_str(); // is this safe??????
udp_slave.sendData(c);
一個
這可能是不安全的。 這取決於robot.pose_Str()
返回的內容。 如果返回的std::string
的生命周期長於c
的生命周期,那么它是安全的。 否則,事實並非如此。
您正在c
中存儲一個在語句執行完畢后將無效的地址。
std::string s = robot.pose_Str();
const char* c = s.c_str(); // This is safe
udp_slave.sendData(c);
在這里,您將在c
中存儲一個地址,該地址將是您從定義s
和c
的范圍中獲得的有效單位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.