[迷信] 割付けたメモリはプログラマが自分で解放しなければならない
動的に割付けたメモリは自分で解放しなければならない、ファイルをオープンすれば自分でクローズしなければならない、その他獲得したリソースは自分で解放しなければならないなど、これらは必ずしも間違ってはいません。実際、C言語ではその通りです。しかし、C++に関していえば、そしてC++をあまり知らない人たちがこうした発言をする場合には、それが迷信によるものである場合が多々あります。
C++を使い慣れた方からすれば、あり得ないような誤解もあります。例えば、int 型や double 型のようなC言語にもあるような型はともかく、クラス型のオブジェクトは常に new で動的に割り付ける必要があるというものです。おそらく、Javaか何か別の言語からの類推によるものでしょう。
C++では、クラス型のオブジェクトであっても自動記憶域期間を持つことができますので、ブロックから出て生存期間を終えた時点でメモリは自動的に解放されます。オブジェクト内部で管理しているメモリやその他のリソースも、デストラクタで解放するように定義しておけば、個々のオブジェクトについては自分で管理する必要がなくなります。
明示的に new で割付けたオブジェクトであっても、auto_ptr や shared_ptr を使うなどすれば、解放をライブラリまかせにすることができます。Javaなどに比べて、若干タイプ量が多いということはありますが、それは本質的な問題点ではありません。
C言語では面倒だった文字列処理も、
#include <string>
int main()
{
std::string str("あいうえお");
str += "かきくけこ";
std::cout << str << std::endl;
}
のように、文字列のコピーや連結の場合でも、メモリの割付けも解放も全自動で行われますので、難しい操作や面倒な操作は何も必要ありません。
ファイルをオープンした場合でも、
int main()
{
std::ifstream ifs("sample.txt");
...
}
とするだけですので、明示的にクローズする必要はありません。
このようにC++では、楽をするつもりであれば非常に簡単にプログラミングを行うことができます。C++の最大の利点は、効率を改善する場合など、必要であればいつでもそうした便利な機能をあきらめ、低水準な操作を行うことができるところにあります。
この記事のトラックバックURL:
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- [迷信] 'A'~'Z' の値は連続している
- [迷信] 0xe-0xe はゼロ
- [迷信] 1 バイトは 8 ビット
- [迷信] 2の累乗による割り算と右シフトは等価
- [迷信] FILE 型は構造体
- [迷信] abs は常に非負の値を返す
- [迷信] argv[0] はプログラム名
- [迷信] char 型は符号付き
- [迷信] double の出力書式は "%lf"
- [迷信] fflush で入力バッファをクリア
- [迷信] free でメモリを開放する
- [迷信] free に NULL を渡すとクラッシュする
- [迷信] gets は単純に fgets に置き換えられる
- [迷信] isalpha 関数の引数は char 型
- [迷信] new に失敗すると NULL が返る。
- [迷信] scanf ではバッファオーバーランを防げない
- [迷信] scanf でキーボードから入力
- [迷信] setjmp マクロの返却値は変数に代入できる
- [迷信] sizeof は定数式
- [迷信] void main(void)
- [迷信] とりあえず memset で初期化
- [迷信] アルゴリズム関数内で関数オブジェクトはコピーされない
- [迷信] オブジェクトの動的生成に失敗するとメモリリークする
- [迷信] コンストラクタから例外を送出してはならない
- [迷信] コンストラクタで自身をゼロクリア
- [迷信] コンパイラはプログラマの心を察してくれる
- [迷信] コンパイルエラーが出るのでアクセス指定子を修正
- [迷信] ソースコード中の即値を全廃せよ
- [迷信] ソースファイルの末尾に }
- [迷信] データ列のソートには qsort 関数を使うべし
- [迷信] プログラムは必ず main から始まる
- [迷信] 一重引用符の中には一文字しか書けない
- [迷信] 今どき int が 16 ビットの処理系なんて無い
- [迷信] 入力データ格納用配列のサイズは BUFSIZ
- [迷信] 割付けたメモリはプログラマが自分で解放しなければならない
- [迷信] 実数型とは浮動小数点型のことである
- [迷信] 引用符で囲んだヘッダ名はカレントディレクトリから探索する
- [迷信] 文字列から整数への変換には atoi
- [迷信] 構造体のタグ名は下線で始める
- [迷信] 構造体はクラスではない
- [迷信] 識別子に使える文字は英数字と下線のみ
- [迷信] 非局所オブジェクトは外部結合
- C99関数・マクロ・前処理スクリプト集
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ベターCとしてのC++
- マイコン メモ
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

