ヒープ 【heap】
読み方 : ヒープ
OSやアプリケーションソフトが使用するメモリ領域の一種。用途に関係なく自由に確保することができる。
OSからはヒープメモリを確保した位置のアドレスが渡され、アプリケーションソフトはこの値を元にして確保したヒープ領域を使用する。ヒープメモリはアプリケーション側での自由度が高い反面、ガーベジコレクション機能がないプログラミング言語(の処理系)では、確保したヒープをすべて手作業で解放しなければならないため、誤解放や解放漏れなどのミスが起こりやすい。このヒープの解放漏れが「メモリリーク」である。
例えば、
const char *src = "hello";
char dst[256];
strncpy(dst, src, strlen(src));
以下のような標準的コードをディスクリプタを使って書くと、
_LIT(KSrc, "hello");
TBuf<256> dst;
dst.Insert(KSrc);
まぁJavaのプリミティブ型のC++版ですね。
ちなみにintやboolなんかもTInt,TBoolなどクラス化されてます。
Tはスタックに持つクラスですという意味。
ヒープに持つ場合にはCが先頭に付く。
objStackを渡さなきゃいけない理由が良くわからないな。グローバルなんでしょ?
ついでに、もしスタックがグローバルなものだとして、pushとpopしかできないものだとすると致命的な欠点があるんじゃ?
leaveする可能性のある処理で、関数αを呼び出すとして、それにobjStackを渡して、α内でスタックに2個push(つまりnew)して、
1個popし忘れ(つまりdeleteし忘れ)たとすると、スタックの位置がずれるわけだよな。でもって、関数から戻った後
function自体で何度かpopするわけで、そうなるとαでdeleteし忘れたものは行方不明だよな。
そもそも確保したらpushする。開放したらpopするという固定処理をプログラマが書くのはどうかと思う。
私の方法だと、開放し忘れは関数から抜ける時に自動で開放される(gabage collect)し、プログラマが意識しなければならないのは
永続オブジェクトを作る場合だけになる。あと、私の方法なら、CObjectStackの寿命を基準として動的確保したオブジェクトの
寿命を決めることができるので便利。
というか、要するに、私の方法だと、javaのように、deleteする必要がなくなるって事だな。
私は基本的に超高級言語(perl,java,phyton,ruby,etc...)系はあまり好きではないので
本とか資料(仕様)を読むことはまず無いからそのへん局長のほうがいろいろ知ってると思うんだが、
とりあえずobjectstackについては私の方法はかなりイイと思うんだけどどう?(そのうちライブラリ化するので意見とかあれば欲しいな)のせ