C++の new の挙動から始めて、メモリ管理に関して二、三回記事を書きたい。 今回はオブジェクト生成のよくある誤解について。
本題
C++における典型的なオブジェクトの生成方法として、次の方法が知られている。
int main()
{
Foo b = Foo();
Foo * a = new Foo();
return 0;
}
- 前者 : スタック領域を利用する。関数から抜けると破棄される(自動変数)。
- 後者 : ヒープ領域を利用する。 delete で明示的に破棄する。動的な割り当て。
Web上の資料では、メモリ上の取り扱いと変数の寿命の二点が着目されて、上記のような説明になることが多い。しかしこれは100%正しいわけではない。
というのも、自動変数は必ずしもスタック領域に配置されるとは限らないし、 new 演算子もヒープ領域から割り当てるよう決められているわけではない [1]。 つまりこれらの挙動は そうなっていることが多い というだけで、本当は実装に依存しているようだ。
(とはいえ大半の実装がそうしているなら、そういう挙動を仮定することに問題があるとは思わないが)
では、このヒープ領域とかスタック領域は一体なんだろうか? これらの定義は? 領域の境界は? 二つを区別して使い分ける意義は?
この詳細は次回の課題としたい(続く)。
追伸:C++ というタグは使えないらしい……。後日原因を調査する。
参考文献
[1] | 江添 亮, "C++11: Syntax and Feature" URL: http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml |