std::string
がスタックに割り当てられ(自動保存期間)、ポインタに割り当てられます。その後、ポインタはnullに設定されます。関連付けられたポインタまたは変数なしでスタックに格納された整数の割り当て解除
std::string* myString = &std::string("");
myString = nullptr;
はmyString
直ちに第2の命令の後に割り当て解除またはオブジェクトが破棄された後、それがメンバーであれば関数は、それぞれ返した後にのみです。
std::string
がスタックに割り当てられ(自動保存期間)、ポインタに割り当てられます。その後、ポインタはnullに設定されます。関連付けられたポインタまたは変数なしでスタックに格納された整数の割り当て解除
std::string* myString = &std::string("");
myString = nullptr;
はmyString
直ちに第2の命令の後に割り当て解除またはオブジェクトが破棄された後、それがメンバーであれば関数は、それぞれ返した後にのみです。
myString
は割り当てられていないため、どこでも「割り当て解除」されません。 myString
が自動スコープでインスタンス化されました。
myString
が宣言されたスコープが終了すると、myString
が範囲外になり、破棄されます。関数のトップスコープでmyString
が宣言されていた場合、関数が戻るときにこれが発生します。スコープが終了するまで、myString
はそれ自体がポインタの有効なインスタンスのままです。
最初の文は、すぐに破棄される一時オブジェクトを指すようにmyString
を設定します。ステートメント自体は有効ですが、そのポイントからポインタを逆参照すると、未定義の動作になります。次のステートメントは、ポインタをnullptr
に設定するため、未定義の動作は発生しません。
"声明はそれ自身ヴァリです..."、有名な最後の言葉。 –
I。最初の命令のmyStringが何かを指し示すことができるのですが、そうですか? myStringがメンバーとして宣言されている場合はどうなりますか? – user1056903
@ user1056903はい、未定義の動作です。しかし、これは式の直後に破棄される一時的な変数であることを理解する必要があります(2行目が実行される前に、myStringは無効なアドレスを指す)。 戻り値(ポインタではない)を保存しない限り、ポインタは破棄され無効になります。 –
ポインタにstring
を割り当てることはできません。ただし、string
ポインタにstring
のアドレスを割り当てることができます。私は有効なC++のコードを変更してみましょう:
std::string s = "";
std::string* s_ptr = &s;
s_ptr = nullptr;
あなたがs
を指すようにたまたまポインタの値がまったく文字列には影響しない変更するという事実。あなたが紙の上に友人の家のアドレスを書いていると想像してください。あなたはその紙のアドレスを消すと、家は破壊されますか?幸いではない。
PS:この類推の限界は、C++では "紙の部分"を使用して "このアドレスで家を破壊する"ことができます(別名delete s_ptr
です。ポインターが指している文字列はnew
で作成されていません)。幸いにも、これは実際の生活では機能しません;)
そのコードはコンパイルされません。実際のコードを投稿してください。 –
VS 2015でコンパイルします。 – user1056903
@user - 警告レベルを適切に設定していない場合はありません。 VS2015は次のように述べています: "警告C4238:非標準拡張が使用されました:クラス値は左辺値として使用されました" *。あなたは一時的なアドレスを使用することはできません。 –