【C++】ダングリングポインタをAWS Cloud9で実行してみた!


C++のダングリングポインタがよく分からないから教えてほしいんだけど。。
具体的なソースコードもあると嬉しいな。
こんな疑問にお答えします。
- 本記事の内容
- 本記事の信頼性
本記事を書いている僕はエンジニア歴7年です。
C++は普段から勉強しているので、かなり有益な情報を発信できるかと思います。
ダングリングポインタは無効なメモリ領域を指すポインタのことです。
今回はC++のサンプルコード付きで解説していきますね。
本記事を読んでいただければ、C++のダングリングポインタがしっかりと理解できるので早速見ていきましょう!



サクッと読み終わるので、是非最後まで読んでみてください!
【前提】実行環境
今回は「AWS Cloud9」を利用します。



実行できる環境であれば何でもOKです!
ダングリングポインタとは
ダングリングポインタとは、無効なメモリ領域を指すポインタのことです。
ポインタは本来メモリ領域(アドレス)を指すものですが、仮にこのメモリ領域が解放(破棄)されていた場合、存在しない領域を指すことになります。
ダングリングポインタを使うとどうなる?
結論、ダングリングポインタを使うとどうなるかは分かりません。
コンパイラの解釈次第ですが、最近のコンパイラはダングリングポインタの恐れがある場合に警告を表示してくれます。
ダングリングポインタを使った場合
ダングリングポインタを使った場合、以下のような事象が発生します。
- プログラムがクラッシュする
- 正常な振舞いをしているが、実際はデータを破棄しながら暴走する
- DB破壊
ダングリングポインタの実装例
#include <iostream>
int *dangling_pointer() {
int dp = 100;
return &dp;
}
int main() {
int *dp = dangling_pointer();
*dp = 100;
}
↑がダングリングポインタの実装例です。
解説
#include <iostream>
int *dangling_pointer() {
int dp = 100;
return &dp;
}
int main() {
int *dp = dangling_pointer();
*dp = 100;
}
dangling_pointer関数でアドレスを返却していますが、このアドレスはdangling_pointer関数終了時に破棄されます。
#include <iostream>
int *dangling_pointer() {
int dp = 100;
return &dp;
}
int main() {
int *dp = dangling_pointer();
*dp = 100;
}
存在しないアドレスを変数に格納しています。
#include <iostream>
int *dangling_pointer() {
int dp = 100;
return &dp;
}
int main() {
int *dp = dangling_pointer();
*dp = 100;
}
ダングリングポインタに値を格納しています。
ダングリングポインタをAWS Cloud9で実行する
Running /home/ec2-user/environment/lambda/dangling_pointer.cc
/home/ec2-user/environment/lambda/dangling_pointer.cc: In function ‘int* dangling_pointer()’:
/home/ec2-user/environment/lambda/dangling_pointer.cc:4:9: warning: address of local variable ‘dp’ returned [-Wreturn-local-addr]
int dp = 100;
^
Process exited with code: 0
警告が出ていますが、実行結果は「0」なので正常終了しています。



とりあえず「想定していない挙動をする」と理解しておけばOKです!
よくある質問 | C++のダングリングポインタ
- ダングリングポインタとは何ですか?
-
無効なメモリ領域を指すポインタのことです。
- ダングリングポインタを使うとどうなりますか?
-
予期せぬエラーが発生します。
まとめ | C++のダングリングポインタ
今回は、C++のダングリングポインタについて解説しました。
以下が本記事のまとめになります。
- ダングリングポインタとは、無効なメモリ領域を指すポインタのこと。
- ダングリングポインタを使用すると予期せぬ挙動をする。
- 最近のコンパイラはダングリングポインタを使用すると警告を出してくれる場合がある。
この記事があなたのお役に立てば幸いです。
サイト内には、他にも初心者向けの記事を多く投稿していますので良ければ参考にしてみてください。
最後までお読みいただきありがとうございました!