SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Modern C++入門

かつての当たり前が通用しない? Modern C++ではやらないこと

第1回 newもdeleteも呼ばないで!

  • X ポスト
  • このエントリーをはてなブックマークに追加

2. 生のポインタは使わないで!

  • char *やvoid *などの生のポインタは使わない。
  • ポインタを使いたければスマートポインタで。

 これってキツくないですか? C言語といえばポインタ、ポインタといえばC言語でしょう。C++になってクラスが導入されましたけど、インスタンスを使うときにはやはりポインタが大活躍しました。これを使うなとは……。

 でもよく読んでください! ポインタを使うなではなくて、「生の」って付いているじゃないですか。そうか、生のポインタを使うなってだけで、ポインタそのものは使えるのですね、少し安心しました。ところで「生のポインタ」って何でしょうか?

 生のポインタとは、C言語からの伝統でもある、「char *」などです。生のポインタという表現が文字通り生々しいなら、「剥き出しのポインタ」とでもしましょうか(余計に生々しくなった?)。表現は置いておいて、生のポインタの問題点をおさらいしましょう。リスト3のプログラムを実行すると、エラーになって異常終了してしまいます。

[リスト3]問題のあるポインタの使い方(dangling.cpp)
#include <iostream>
using namespace std;

int main()
{
    char *p;

    *p = 'A';
    cout << *p << "\n";
      // zsh: segmentation fault  ./dangling
    return 0;
}

 char型のポインタpが宣言されてますけど、初期化されていません。ここに「*p」を使って'A'を入れようとしていますが、明らかにダメです。pがどこを指しているか分からない、すなわちダングリングの状態だからです。では初期化すればいいんでしょうか?pを宣言する行を書き換えてみます。

[リスト4]やっぱり問題のあるポインタの使い方(dangling_2.cpp)
…略…
char *p = NULL;
…略…
cout << *p << "\n";
  // zsh: segmentation fault  ./dangling_2

 pは初期化はされていますが、NULLという値(これも実際のところどういう値なのかは分からない)を使っているので、そこが安全な場所であるかは分かりません。たいていの場合はイケない場所なので、これも'\0'を代入したとたんにおかしなことになります。ダングリングであることには変わりません。なお、Modern C++ではNULLも使ってはいけないことになっています。「どこも指していない」ことを明示するnullptrというものがあるようです。

 要は、生のポインタを使う限り、ポインタで指す場所が有効であるかということは、プログラマが責任を持って保証してあげなければならないということです。これは、バグを防ぐためにも必要なことですが、プログラマにとって大きな負担ともなります。どうせなら、生のポインタは使えなくなってくれればいいのに!ということで、前節のnew演算子です。new演算子を使った結果はやはり生のポインタでしたが、スマートポインタというものを使うことで、生のポインタの使用を避けて、メモリの確保と解放も自動でやってくれます。スマートポインタについてもどこかの回で紹介します。

次のページ
3. データ型は明示しないで!

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Modern C++入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16769 2022/12/01 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング