What's "new" ? #1

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