3

プログラムがちょうど始まったばかりであるかのように、mallocを初期状態に戻す方法があるかどうか知っていますか?

理由:ニンテンドーdevkitproを使用して組み込みアプリケーションを開発しており、ソフトウェア障害が発生した場合のデバッグサポートを改善できるようにしたいと考えています。私はすでにほとんどのエラーをキャッチして、たとえばコンソールメニューに戻ることができますが、std::bad_allocをキャッチするとこれは機能しません。

「ソフトリブート」に使用するコードには、制御できない時点でmalloc()自体が含まれていると思われるので、「実行中のアプリのすべてを忘れて、最初からやり直したい」と思います。

4

7 に答える 7

3

これを移植可能に行う方法はありませんが、おそらくC++の組み込み実装が拡張機能として提供する可能性があります。代わりに、メモリプールを使用するか、既存のライブラリを使用して、独自の割り当てシステムを作成することを検討する必要があります。

于 2009-12-16T13:25:42.823 に答える
2

私が似たようなことをしたときだけ、割り当てられた各ブロックへの参照を保持する独自のアロケータを使用しました。ロールバックしたい場合は、割り当てられたすべてのブロックを解放し、longjmpを実行してプログラムを再起動します。

于 2009-12-16T13:26:35.083 に答える
2

グローバルな場所で少しのメモリをリスします。

int* not_used = new i[1024];

次に、を取得したら、std::bad_allocnot_usedを削除して、エラーコンソールに移動します。アイデアは、クラッシュハンドラーに必要なことを実行するのに十分なスペースを与えることです。コンソールがメモリ不足エラーも受け取らないように、予約されるメモリの量を調整する必要があります。

賢い場合は、not_usedを実際に使用できます。ただし、メモリを使用していたものはすべて、通知なしに削除される可能性があることに注意する必要があります。

于 2009-12-16T15:38:37.500 に答える
1

他に何も実行されていない場合は、APIが任天堂で提供するメモリブロック全体をゼロ書き込みできると思いますか?ただし、それ以外の場合は、割り当てを追跡します。

実際、CatchAndRelease割り当てられたすべてのメモリブロックへの参照を保持するクラスを作成すると、必要なときに戻ってそれらをクリアすることができます。

そうでなければ、ニールが述べたように、あなたはあなた自身のメモリプールを書く必要があるかもしれません。

于 2009-12-16T13:30:18.787 に答える
1

新たに開始する唯一の方法は、ストレージからアプリケーションをリロードすることです。DSはすべてをRAMにロードします。これは、データセクションがその場で変更されることを意味します。

于 2010-01-14T12:23:02.443 に答える
1

後入れ先出し以外の方法でメモリを解放する必要がありますか?そうでない場合は、使用可能なすべてのメモリを使用するように配列を定義し(これを行うには、おそらくリンカーファイルを微調整する必要があります)、その配列の先頭へのポインターを初期化することをお勧めします。次に、独自のmalloc()関数を記述します。

char * distribution_ptr = big_array;

void * malloc(size_t n)
{{
  void * temp =(void *)allocation_ptr;
  if(allocation_ptr> END_OF_ALLOCATION_AREA-n)
    0を返します。
  割り当て_ptr+= n;
  温度を返す;
}

void free_all_after(void * ptr)
{{
  if(ptr)
    割り当て_ptr=(char *)ptr;
}

この実装では、free_all_after()は、示されたポインターとその後に割り当てられたすべてのものを解放します。malloc()の他の実装とは異なり、これはオーバーヘッドがゼロであることに注意してください。LIFOの割り当ては非常に制限されていますが、多くの組み込みシステムでは完全に適切です。

于 2010-12-20T16:49:25.807 に答える
0

std :: bad_allocは、newが失敗し、要求されたメモリを割り当てることができない場合に発生します。これは通常、ヒープのメモリが不足しているために要求を受け入れることができない場合に発生します。このため、クリーンアップで新しいメモリを確実に割り当てることはできません。

これは、クリーンアップのために新しいメモリを割り当てることができないことを意味します。クリーンアップを成功させる唯一の希望は、クリーンアップコードのメモリが、実際に必要になる前に事前に割り当てられていることを確認することです。

inplace new演算子(つまり、メモリアドレスを指定する場合はnew)を使用して、オブジェクトをこのクリーンアップメモリ​​に新規作成できます。

于 2009-12-16T14:30:46.683 に答える