簡體   English   中英

string和const char *和.c_str()?

[英]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中存儲一個地址,該地址將是您從定義sc的范圍中獲得的有效單位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM