私は長年 Java で開発を行ってきましたが、C++ に切り替えたいと考えているため、メモリ管理システムを理解するのに苦労しています。
小さな例で状況を説明しましょう。
私の理解では、スタックまたはヒープのいずれかにスペースを割り当てることができます。1 つ目は、次のように変数を宣言することによって行われます。
int a[5]
また
int size = 10;
int a[size]
逆に、ヒープにメモリを割り当てたい場合は、「new」コマンドを使用して実行できます。たとえば、次のようにします。
int *a = new int[10]; (notice that I haven't tried all the code, so the syntax might be wrong)
2 つの違いの 1 つは、関数が終了したときにスタックに割り当てられている場合、スペースは自動的に割り当て解除されますが、それ以外の場合は、delete() で明示的に割り当てを解除する必要があることです。
さて、次のようなクラスがあるとします。
class A {
const int *elements[10];
public void method(const int** elements) {
int subarray[10];
//do something
elements[0] = subarray;
}
}
さて、いくつか質問があります:
- この場合、部分配列がスタックに割り当てられます。関数メソッドが終了した後でも、elements[0] を見ると部分配列のデータがまだ表示されるのはなぜですか? コンパイラはヒープ割り当ての最初の割り当てを変換しましたか (この場合、これは良い習慣ですか)?
- サブアレイを「const」として宣言すると、コンパイラはそれを要素に割り当てさせません。なぜだめですか?const はポインターを変更できないことだけに関係していると思いましたが、他には何もありませんでした。
- (これはおそらくかなりばかげています) 「要素」を固定の 10 個の要素ではなく、コンストラクターからのパラメーターで割り当てたいとします。スタックに割り当てることはまだ可能ですか、それともコンストラクターは常にヒープに割り当てますか?
そのような質問で申し訳ありませんが (専門の C プログラマーにはばかげているように見えるかもしれません)、C++ のメモリ管理システムは Java とは大きく異なります。また、リークや低速なコードを回避したいと考えています。よろしくお願いします!