Frage

Wissen Sie, ob es ein Weg zurück malloc in seinem ursprünglichen Zustand zu bringen, als ob das Programm gerade begann?

Grund: Ich bin eine eingebettete Anwendung entwickeln mit dem NintendoDS devkitPro und ich möchte in der Lage sein, Debugging-Unterstützung zu verbessern, bei Software-Fehlern. Ich kann bereits die meisten Fehler fangen und z.B. Rückkehr zum Menü der Konsole, aber das funktioniert nicht, wenn std :: bad_alloc zu kontrollieren.

Ich vermute, dass der Code, den ich für „soft reboot“ verwenden beinhaltet malloc () selbst an einem gewissen Punkt, den ich nicht kontrollieren kann, so dass ich zu „vergessen Sie alles über die laufende App und einen Neuanfang“ möchte.

War es hilfreich?

Lösung

Der einzige Weg, einen Neuanfang zu erhalten, ist die Anwendung von Speichern zu laden. Das DS lädt alles in dem RAM was bedeutet, dass der Datenabschnitt an Ort und Stelle verändert.

Andere Tipps

Es gibt keine Möglichkeit, dies zu tun, portabel, obwohl concievably eine eingebettete Implementierung von C ++ als Erweiterung liefern könnte. Sie sollten Ihr eigenes Zuteilungssystem zu schreiben, mit Speicherpools suchen stattdessen oder eine vorhandene Bibliothek verwenden.

Nur die Zeit ich habe etwas ähnliches, haben wir unser eigenes allocator, die einen Verweis auf die jeweils zugewiesenen Blöcke halten würden. Wenn wir zurückzurollen wollen, würden wir alle die zugewiesenen Blöcke befreien und eine longjmp tun, das Programm neu zu starten.

Eichhörnchen weg ein wenig Speicher in einer globalen Position z.

int* not_used = new i[1024];

Wenn Sie dann eine std::bad_alloc erhalten, löschen not_used und fahren Sie mit Ihrer Fehlerkonsole. Die Idee ist, Ihrem Crash-Handler gerade genug Raum zu geben, zu tun, was Sie brauchen. Sie werden zu stimmen, wie viel Speicher reserviert ist, so dass die Konsole auch nicht von Speicherfehlern empfangen werden.

Wenn Sie klug sind, NOT_USED tatsächlich verwendet werden könnte. Aber Sie würden müssen vorsichtig sein, dass alles, was Speicher wurde mit konnte ohne vorherige Ankündigung gelöscht werden.

Ich nehme an, wenn nichts anderes läuft man konnte den ganzen Speicherblock Null-schreiben, dass der API auf dem Nintendo bietet? Aber sonst hält nur den Überblick über Ihre zuordnet.

In der Tat, wenn Sie eine CatchAndRelease Klasse erstellen, um jeweils einen Verweis zu halten und all zugeordneten Speicherblock, in der erforderlichen Zeit konnte man zurückgehen und die heraus löschen.

Ansonsten müssen Sie Ihren eigenen Speicherpool schreiben, wie Neil erwähnt.

Haben Sie jemals den freien Speicher müssen in etwas anderes als last-in-first-out Bestellung? Wenn nicht, würde ich vorschlagen, dass Sie einen Array definieren die gesamten verfügbaren Speicher zu verwenden (Sie werden wahrscheinlich die Linker-Dateien zu optimieren, dies zu tun) und initialisieren dann einen Zeiger auf den Anfang des Arrays. Dann schreiben Sie Ihre eigene malloc () Funktion:

char *allocation_ptr = big_array;

void *malloc(size_t n)
{
  void *temp = (void*)allocation_ptr;
  if (allocation_ptr > END_OF_ALLOCATION_AREA - n)
    return 0;
  allocation_ptr += n;
  return temp;
}

void free_all_after(void *ptr)
{
  if (ptr)
    allocation_ptr = (char*)ptr;
}

Bei dieser Implementierung free_all_after () den angegebenen Zeiger frei und alles zugeteilt, nachdem es . Beachten Sie, dass im Gegensatz zu anderen Implementierungen von malloc (), dieser hat Null Overhead. Die LIFO-Zuordnung ist sehr einschränkend, aber für viele Embedded-Systeme wäre es völlig ausreichend sein.

std :: bad_alloc tritt auf, wenn neue ausfällt und forderte die Speicher nicht zuordnen kann. Dies wird in der Regel auftreten, wenn die Heap-Speicher leer ist und daher die Anforderung nicht ehren können. Aus diesem Grunde werden Sie nicht in der Lage, jeden neuen Speicher zuverlässig in der Bereinigung zuzuordnen.

Das bedeutet, dass Sie keine neuen Speicher für die Bereinigung zuweisen kann. Ihre einzige Hoffnung der Reinigung erfolgreiche Inbetriebnahme, dass der Speicher für den Bereinigungscode, um sicherzustellen, vorbelegt gut, bevor Sie tatsächlich benötigen.

Die Objekte können noch in diesem Bereinigungs Speicher newed werden mit der Inplace neuen Betreiber (dh neu in dem Sie eine Speicheradresse liefern)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top