私は、次のコード(簡体字)を見て、それがこのreturnMsg
機能を使用する方法も安全です自問しています:内部的に静的なstd :: stringを使用する関数からconst char *を返すのは安全ですか?
#include <iostream>
using namespace std;
const char *returnMsg(const char *msg)
{
static std::string message;
message = msg;
return message.c_str();
}
int main(int argc, char *argv[])
{
const char *msg1 = returnMsg("Hello world");
printf("msg1 = %p\n", msg1);
cout << msg1 << endl;
const char *msg2 = returnMsg("Good bye");
printf("msg2 = %p\n", msg2);
cout << msg2 << endl;
cout << msg1 << endl;
return 0;
}
出力は次のとおりです。
msg1 = 0x23a6028
Hello world
msg2 = 0x23a6028
Good bye
Good bye
msg2
は二回書かれていると、それは何ですか私は静的メッセージ変数はプログラムの寿命中にメモリに残っており、メモリの再割り当てがないので、msg1
のアドレスに書き込まれた内容は新しい内容のmsg2
に置き換えられます。 msg2
のサイズが大きい場合
しかし、std::string message
変数内の内部再配分があり、出力は次のとおりです。
msg1 = 0x1cc6028
Hello world
msg2 = 0x1cc6058
Good bye looooooooooooooooooooooooooooooooooooooooong
Hello world
が、私はmsg1
アドレスはで再利用されないという保証がないことを推測します将来的には、msg1
コンテンツに新たにアクセスすると、最終的には異なるものとなり、一貫性のないものが表示される可能性があります。
上記の制限なしにこの機能を使用できるようにするには、この機能を別の方法で書き込む必要がありますか?
実際に行うはずの機能は何ですか? 'const char * msg2 ="さようなら ";と'あなたはあなたが今いる問題に対処する必要はありません – user463035818
@ tobi303私はOPのために話すことができませんが、静的ではない文字列で関数が呼び出され、そのバッファがもはや存在しなくなった後にポインタが使用されるところでは、わずかに少ない例を考えます。この関数は、その内容を静的な文字列にコピーすることによって、そのバッファの存続期間を便利に延長することができます。ただし、次回の関数呼び出しまでです。 – user2079303
@ user2079303嫌なことはありませんが、私はそのような機能を装飾的な世界とみなしています。それはグローバルよりも悪いです。 – user463035818