こんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴9年)で、資格は13個保有しています。
ダングリングポインタは無効なメモリ領域を指すポインタのことです。
今回は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++ 新版
最後までお読みいただき、ありがとうございました!
- クソおすすめ本
海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。