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

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

C++のダングリングポインタがよく分からないから教えてほしいんだけど。。
具体的なソースコードもあると嬉しいな。

こんな疑問にお答えします。

  • 本記事の内容
  • 本記事の信頼性
プロフィール
  • フリーランスエンジニア(保有資格約20個)
  • ブログ・アフィリエイト歴5年
  • ブランドせどりで月利50万円⇨脱サラ
  • Twitterフォロワー約2,000人
いずみん

本記事を書いている僕はエンジニア歴7年です。
C++は普段から勉強しているので、かなり有益な情報を発信できるかと思います。

ダングリングポインタは無効なメモリ領域を指すポインタのことです。

今回はC++のサンプルコード付きで解説していきますね。

本記事を読んでいただければ、C++のダングリングポインタがしっかりと理解できるので早速見ていきましょう!

いずみん

サクッと読み終わるので、是非最後まで読んでみてください!

\ 年収が2倍に?! /

目次

【前提】実行環境

今回は「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++のダングリングポインタについて解説しました。

以下が本記事のまとめになります。

まとめ
  • ダングリングポインタとは、無効なメモリ領域を指すポインタのこと。
  • ダングリングポインタを使用すると予期せぬ挙動をする。
  • 最近のコンパイラはダングリングポインタを使用すると警告を出してくれる場合がある。

この記事があなたのお役に立てば幸いです。

サイト内には、他にも初心者向けの記事を多く投稿していますので良ければ参考にしてみてください。

最後までお読みいただきありがとうございました!

最後に

僕が個人的におすすめするフリーランスエージェントをご紹介します。

いずみん

エンジニアで実務経験のある方(目安は3年)はフリーランスも視野に入れましょう。

僕自身、フリーランスになって収入が2倍(年収+280万)になりました。

あなたの貴重なスキルを安売りしないようにしましょうね!

初めてのフリーランスなら「レバテックフリーランス」

総合評価案件数(公開)面談
約40,000件無料
マージン率単価アフターフォロー
10〜20%あり
Good Point
  • 国内最大級のフリーランスエージェント
  • 案件数は約40,000件(国内最多)
  • 高単価案件が豊富
  • マージン率は10〜20%

は国内最大級のフリーランスエージェントです。

高単価案件が豊富で、初めてフリーランスになる方におすすめのエージェントです。

いずみん

僕も最初はレバテックを利用しましたが、おかげさまで収入が約1.5倍になりました(笑)。

正社員並みの保証なら「Midworks(ミッドワークス)」

総合評価案件数(公開)面談
約3,000件以上無料
マージン率単価保証
非公開
Good Point
  • 正社員並みの手厚い保証
  • 給与保証あり
  • 非公開案件が豊富
  • マージン率は一律20%

正社員並みの手厚い保証を受けたい方におすすめのエージェントです。

非公開案件が豊富で給与保証も付いているので、安心してフリーランスにチャレンジできますよ!

いずみん

ちなみに僕はMidworks経由でフルリモート案件に参画できました!
営業担当の方も真摯に対応してくれて非常に助かりました。

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

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次