ホーム » スタッフ » 斉藤徹 » ヒープメモリの演習

2012年5月
« 4月   6月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

ヒープメモリの演習

先週のmalloc+freeの説明後ということで、今日は演習の時間とした。

ヒープメモリ演習テーマ

大きさの解らないデータを入力し、何らかの処理を加えて出力する。 例えば、きわめて長い名前の人がいるかもしれないクラスの名簿を読み込む。 名簿の人数は、プログラム作成時は解らないものとする。 もしくは、成績表の集計を行うプログラムを作る。ただし、科目数や対象人数は変更できること。 演習の自信の無い人は、プログラムを実行し処理を始める前に、 データ件数を入力などを入力するという方法でもよい。

途中で配列サイズを変えるテクニック

最初にデータ件数などを入力するのは、現実の処理ではあまりない。 プログラミングでよく使われるテクニックは、 あらかじめ適当な大きさで配列を作り、その中にデータを保存していく。 途中で配列サイズからあふれる場合は、新しく2倍の大きさの配列を確保し、 新しい配列に、元の配列の中身をすべてコピーする。 そのあと、配列を指すポインタを、2倍の配列側に切り替え、元々の配列はfreeで廃棄する。

C++でのnewとdelete

前回の授業では、malloc+freeを用いたけど、最近はオブジェクト指向のC++を使うことが多い。 簡単に、new-deleteの使い方を説明する。

// C言語であれば
int size = 適当な大きさ ;
int *p ;
if ( (p = (int*)malloc( sizeof( int ) * size )) != NULL ) {
pを配列として使った処理... ;
free( p ) ;
}
// C++であれば、
p = new int[ size ] ; // C++ではメモリ確保失敗は例外処理で対応
pを使った処理... ;
delete [] p ;         // [] は配列をdeleteする場合のみ

deleteの[]をつける意味が分かりにくいので、普通の使い方の例を、おまけで書いておく。

struct A {
なんらかの要素 ;
} *p ;
// C言語の場合
if ( (p = (struct A*)malloc( sizeof(struct A) )) != NULL ) {
pの構造体を使った処理 ;
free( p ) ;
}
// C++の場合
p = new A ;
pの構造体を使った処理 ;
delete p ;