質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

1049閲覧

c++アドレス周りの確認

apa

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/07/04 09:00

struct FS { int i; //FS(int a) { i = a; } }; FS& ret() { FS f; f.i = 100; printf("%p\n", f); return f; } int main() { //printf("%d", ret().i); FS f = ret(); printf("%p", f); }

ret()が終わったタイミングで ret()内のfはメモリから消されてしまう
と思うのですが、main関数 fのアドレスとret内fのアドレスが一致し
main内からf.iを行っても100と出力されています
これはメモリは消されているが
書き残しが残っているとおもっていればよいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ret()が終わったタイミングで ret()内のfはメモリから消されてしまう

と思うのですが、main関数 fのアドレスとret内fのアドレスが一致し
main内からf.iを行っても100と出力されています

消えたものについてどう考察しても意味はありません。
「たまたまそうなった」と考える以外ないでしょう。

投稿2021/07/04 10:33

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C++

1printf("%p", f);

fのアドレスを表示したいのなら、こうではないでしょうか。

C++

1printf("%p", &f);

投稿2021/07/04 10:44

actorbug

総合スコア2231

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

メモリについて再確認を行いました
自分が例に挙げた FS f = ret();
ですがこちらはret()の戻り値のコピーが作られるため動作の問題はありません。
FS& fとした場合はret()から参照を受け取るため動作の保証はないということです

投稿2021/11/21 13:29

apa

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すでに回答がされていますので、蛇足かも知れませんが…。

ret()が終わったタイミングで ret()内のfはメモリから消されてしまう

この文の意味が曖昧です。
「メモリから消される」とはどういう意味に理解されていますか?
関数から出た後でのローカル変数に付いて、もう一度参考書なりで確認して下さい。
ローカル変数の変数名って、質問の例の場合、単なる「目印」です。
ノートに貼った付箋をとっても、そのページは存在し続けます。
そういうことです。

投稿2021/07/05 01:41

nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ポインタではない構造体の宣言がコンパイル時点で決まるスタック領域でのはなしなので
メモリの開放は行われない
メンバ関数を抜けた後もメモリを保持し続けている
また代入して同じアドレスが表示されていたのは
書式に&が抜けていたことが原因でした

投稿2021/07/04 13:41

編集2021/07/04 13:45
apa

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/07/04 15:18

> メンバ関数を抜けた後もメモリを保持し続けている いえ、関数を抜けた時点でret()内のfは無効です。main()では無効なメモリを参照しています。
thkana

2021/07/04 23:22

> スタック領域のはなしなのでメモリの'解放'は行われない スタック領域ってなに? ということについて再確認が必要かと思います。もしかしたら「メモリって何?」という話に波及するかも知れませんが。 > 同じアドレスが表示されていた アドレスではないものを表示していた、ということです。
apa

2021/07/05 01:00

返信ありがとうございます スタック領域ってコンパイル時に決まるんじゃなかったんですね 勉強不足なので勉強しなおしてきます!
YT0014

2021/08/30 00:22

ローカル変数は、メモリ上に確保される保証すらなく、レジスタだけで処理されることもあります。 また、規格上、未定義とされているので、特定のコンパイラの、特定のソースの、特定のオプションでの動作の1例でしかないので、条件が異なった場合、動作も異なる可能性があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問