![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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);
No.1ベストアンサー
- 回答日時:
>やはり下のようにリサイズに失敗したら新たに領域を確保し
>それまでのデータをコピーするのが普通なのでしょうか?
移動可能にするのが普通だと思うのですが。
移動可能にできない理由は何でしょうか?
結局自分で再確保してコピーをするのであれば、移動可能にしておくのと同じだと思うのですが。
この回答への補足
移動可能にできない理由はそれまでに、代入したデータの値を変えたくないからです。
>結局自分で再確保してコピーをするのであれば、移動可能にしておくのと同じだと思うのですが。
それは確かにそうですね。移動可能にしてコピーが普通ですか?
すみません
補足の欄に書いてしまいました
大きな勘違いをしていました
HeapReAllocはメモリの移動が起こっても、データの内容は消えないのすね
VBのReDimのイメージがあったもので、行動してしまいました
どうもありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:02
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
newしないオブジェクトについて
-
ビットをローテートするプログ...
-
stringの最大サイズ
-
c言語のポインタへの文字列入力...
-
malloc呼び出し時のセグメンテ...
-
64ビットと32ビットの違い
-
指定したメモリアドレスの値の...
-
C言語 mallocとfreeについて
-
構造体でchar name[]と*nameの...
-
CreateFileMapping について
-
大容量の静的な確保の限界値
-
dllを使用しVB側に文字列...
-
C++のnewで確保したメモリーの...
-
MSDNがgethostbynameではなくge...
-
win32APIのHeapAlloc()の使い方...
-
入れ子になった構造体について
-
void*型のデータサイズ
-
メモリマップドファイルを可変...
-
C++で、メンバもヒープに確保さ...
-
構造体を使ったファイルの読み込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報