動的に割付けたメモリは自分で解放しなければならない、ファイルをオープンすれば自分でクローズしなければならない、その他獲得したリソースは自分で解放しなければならないなど、これらは必ずしも間違ってはいません。実際、C言語ではその通りです。しかし、C++に関していえば、そしてC++をあまり知らない人たちがこうした発言をする場合には、それが迷信によるものである場合が多々あります。
C++を使い慣れた方からすれば、あり得ないような誤解もあります。例えば、int型やdouble型のようなC言語にもあるような型はともかく、クラス型のオブジェクトは常にnewで動的に割り付ける必要があるというものです。おそらく、Javaか何か別の言語からの類推によるものでしょう。
C++では、クラス型のオブジェクトであっても自動記憶域期間を持つことができますので、ブロックから出て生存期間を終えた時点でメモリは自動的に解放されます。オブジェクト内部で管理しているメモリやその他のリソースも、デストラクタで解放するように定義しておけば、個々のオブジェクトについては自分で管理する必要がなくなります。
明示的にnewで割付けたオブジェクトであっても、std::unique_ptrやstd::shared_ptrを使うなどすれば、解放をライブラリまかせにすることができます。Javaなどに比べて、若干タイプ量が多いということはありますが、それは本質的な問題点ではありません。
C言語では面倒だった文字列処理も、
0 1 2 3 4 5 6 7 8 9 10 |
#include <iostream> #include <string> int main() { std::string str("あいうえお"); str += "かきくけこ"; std::cout << str << std::endl; } |
のように、文字列のコピーや連結の場合でも、メモリの割付けも解放も全自動で行われますので、難しい操作や面倒な操作は何も必要ありません。
ファイルをオープンした場合でも、
0 1 2 3 4 5 6 7 8 |
#include <fstream> int main() { std::ifstream ifs("sample.txt"); ... } |
とするだけですので、明示的にクローズする必要はありません。
このようにC++では、楽をするつもりであれば非常に簡単にプログラミングを行うことができます。C++の最大の利点は、効率を改善する場合など、必要であればいつでもそうした便利な機能をあきらめ、低水準な操作を行うことができるところにあります。