掲示板ランキング  スーツ・タキシード(男の子)  帽子  手袋  マフラー  レオタード  エプロン  子供和服


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6852

再割り当てのエラー処理について
投稿者---chu-(2006/12/04 18:34:18)


環境:LSI-C

再割り当てを行うときに、成功するときのみ実行するという処理を考えています。
ようは、失敗しても再割り当て実行前のデータは保持したいのです。
例えば以下のような感じです。

    1.8バイト確保したブロックに1バイトのデータを8つ入力
    2.9つ目のデータを入力したときに、ブロックを16バイトに再割り当てする
    3.成功するならば、再割り当てを実行し、9つ目のデータを格納
      失敗するならば、9つ目のデータは捨てて、捨てたことを知らせる

予め成否を知ることは不可能でしょうから、別の方法でなんとかしようとして以下の方法を考えました。

    new_block = malloc(new_size);
    if ( new_block != NULL ) {
        memcpy(new_block, block, size);
        free(block);
        block = new_block;
        データを格納
    }
    else {
        再割り当て失敗によりデータを捨てたことを知らせる
    }

しかし、単なるrealloc()に比べて以下のデメリットが思い浮かびます。

    ・一時的に(block+new_block)の領域を確保しているのがもったいない
    ・データコピーが必ず行われるのがもったいない

realloc()の恩恵を受けながら同じことを実現できないでしょうか。

下記コードのようなことができると理想的なのですが、
elseの時のold_blockのポイント先は解放済みでしょうから無理そうです。

    old_block = block;
    block = realloc(old_block, new_size);
    if ( block != NULL ) {
        データを格納
    }
    else {
        block = old_block;
        再割り当て失敗によりデータを捨てたことを知らせる
    }



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:再割り当てのエラー処理について 6853 nop 2006/12/04 19:07:17


No.6853

Re:再割り当てのエラー処理について
投稿者---nop(2006/12/04 19:07:17)


> elseの時のold_blockのポイント先は解放済みでしょうから無理そうです。

realloc()は、再割り当てに失敗した時、
元の領域のフリーを行いません。


この投稿にコメントする

削除パスワード

No.6854

Re:再割り当てのエラー処理について
投稿者---chu-(2006/12/05 09:55:44)


返信ありがとうございます。

私の思い込みだったようで、改めて見てみるとしっかり書いてありました。
おかげで理想的な方法で実装できます。

JIS-X3010 - P227
> 新しいオブジェクトに対する記憶域の割付けができなかった場合,
> 古いオブジェクトは解放されずその値は変化しない。

知っていないとうっかりメモリリークさせてしまいそうですね。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ