電子書籍の厳選無料作品が豊富!

HeapReAllocについて質問いたします
VC++5.0 & SDK で作成しています

以下のようにメモリを確保し、その後メモリの移動が起こらないように
HEAP_REALLOC_IN_PLACE_ONLYを指定してHeapReAllocしています
必ず決まった回数でHeapReAllocが失敗してしまいます
やはり下のようにリサイズに失敗したら新たに領域を確保し
それまでのデータをコピーするのが普通なのでしょうか?
ただ単にメモリを移動せずに取れるだけの領域がなくて失敗しているだけならば
いいのですが、それほど大きいサイズでもないし、根本的に間違っているなら
解決にならないと思いまして質問させていただきます
よろしくお願いいたします

time_t*endtime;
time_t*tmptime;

if ((endtime = (time_t *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(time_t) * tile_cnt)) == NULL) {
 return 0;
}
while( tile_cnt < 30 ){
 tile_cnt++;
 // リサイズ
 if((tmptime = (time_t *)HeapReAlloc(GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, endtime,
                       tile_cnt*sizeof(time_t))) == NULL){
  // サイズ拡大できなかったので再度そのサイズで領域確保
  if ((tmptime = (time_t *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(time_t) * tile_cnt))
                       == NULL) {
   HeapFree(GetProcessHeap(), 0, endtime);
   return 0;
  } else {
   // 新しく領域を確保したので今までのデータをコピー
   CopyMemory(tmptime, endtime, sizeof(time_t)*(tile_cnt-1));
   // 元の領域を開放
   HeapFree(GetProcessHeap(), 0, endtime);
   endtime = tmptime;
  }
 } else {
  endtime = tmptime;
 }
}
//解放
HeapFree(GetProcessHeap(), 0, endtime);

A 回答 (1件)

>やはり下のようにリサイズに失敗したら新たに領域を確保し


>それまでのデータをコピーするのが普通なのでしょうか?

移動可能にするのが普通だと思うのですが。
移動可能にできない理由は何でしょうか?

結局自分で再確保してコピーをするのであれば、移動可能にしておくのと同じだと思うのですが。

この回答への補足

移動可能にできない理由はそれまでに、代入したデータの値を変えたくないからです。

>結局自分で再確保してコピーをするのであれば、移動可能にしておくのと同じだと思うのですが。
それは確かにそうですね。移動可能にしてコピーが普通ですか?

補足日時:2002/08/06 19:16
    • good
    • 0
この回答へのお礼

すみません
補足の欄に書いてしまいました

大きな勘違いをしていました
HeapReAllocはメモリの移動が起こっても、データの内容は消えないのすね
VBのReDimのイメージがあったもので、行動してしまいました

どうもありがとうございました

お礼日時:2002/08/06 19:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!