2016-09-18 1 views
0

std::stringがスタックに割り当てられ(自動保存期間)、ポインタに割り当てられます。その後、ポインタはnullに設定されます。関連付けられたポインタまたは変数なしでスタックに格納された整数の割り当て解除

std::string* myString = &std::string(""); 
myString = nullptr; 

myString直ちに第2の命令の後に割り当て解除またはオブジェクトが破棄された後、それがメンバーであれば関数は、それぞれ返した後にのみです。

+3

そのコードはコンパイルされません。実際のコードを投稿してください。 –

+0

VS 2015でコンパイルします。 – user1056903

+0

@user - 警告レベルを適切に設定していない場合はありません。 VS2015は次のように述べています: "警告C4238:非標準拡張が使用されました:クラス値は左辺値として使用されました" *。あなたは一時的なアドレスを使用することはできません。 –

答えて

0

myStringは割り当てられていないため、どこでも「割り当て解除」されません。 myStringが自動スコープでインスタンス化されました。

myStringが宣言されたスコープが終了すると、myStringが範囲外になり、破棄されます。関数のトップスコープでmyStringが宣言されていた場合、関数が戻るときにこれが発生します。スコープが終了するまで、myStringはそれ自体がポインタの有効なインスタンスのままです。

最初の文は、すぐに破棄される一時オブジェクトを指すようにmyStringを設定します。ステートメント自体は有効ですが、そのポイントからポインタを逆参照すると、未定義の動作になります。次のステートメントは、ポインタをnullptrに設定するため、未定義の動作は発生しません。

+1

"声明はそれ自身ヴァリです..."、有名な最後の言葉。 –

+0

I。最初の命令のmyStringが何かを指し示すことができるのですが、そうですか? myStringがメンバーとして宣言されている場合はどうなりますか? – user1056903

+0

@ user1056903はい、未定義の動作です。しかし、これは式の直後に破棄される一時的な変数であることを理解する必要があります(2行目が実行される前に、myStringは無効なアドレスを指す)。 戻り値(ポインタではない)を保存しない限り、ポインタは破棄され無効になります。 –

2

ポインタにstringを割り当てることはできません。ただし、stringポインタにstringのアドレスを割り当てることができます。私は有効なC++のコードを変更してみましょう:

std::string s = ""; 
std::string* s_ptr = &s; 
s_ptr = nullptr; 

あなたがsを指すようにたまたまポインタの値がまったく文字列には影響しない変更するという事実。あなたが紙の上に友人の家のアドレスを書いていると想像してください。あなたはその紙のアドレスを消すと、家は破壊されますか?幸いではない。

PS:この類推の限界は、C++では "紙の部分"を使用して "このアドレスで家を破壊する"ことができます(別名delete s_ptrです。ポインターが指している文字列はnewで作成されていません)。幸いにも、これは実際の生活では機能しません;)

関連する問題