Frage

Gegeben ein Zeiger auf einige Variablen..gibt es eine Möglichkeit zu überprüfen, ob es statisch oder dynamisch zugeordnet??

War es hilfreich?

Lösung

Zitiert aus Ihrem Kommentar:

  

im Herstellen eine Methode, die im wesentlichen aus einer Struktur loswerden wird. es ein Datenelement hat, die ein Zeiger auf etwas, das auf das man kann oder nicht malloced werden .. abhängig, würde Ich mag es befreien

Der richtige Weg ist hinzuzufügen andere Mitglied auf die Struktur:. Einen Zeiger auf eine Aufhebung der Zuordnung Funktion

Es ist nicht nur statische und dynamische Zuordnung. Es gibt mehrere möglich Verteilern, von denen malloc() ist nur eine davon.

Auf Unix-ähnlichen Systemen, könnte es sein:

  • Eine statische Variable
  • Auf dem Stapel
  • Auf dem Stapel, sondern dynamisch zugewiesen (d alloca())
  • Auf dem Heap, mit malloc() zugewiesen
  • Auf dem Heap, mit new zugewiesen
  • Auf der Halde, in der Mitte eines Feldes mit new[] zugewiesen
  • Auf dem Heap, innerhalb einer Struktur mit malloc() zugewiesen
  • Auf der Halde, innerhalb einer Basisklasse eines Objekts mit new zugewiesen
  • Zugeteilte mit mmap
  • mit einem benutzerdefinierten allocator Allocated
  • Viele weitere Optionen, darunter mehrere Kombinationen und Variationen der oben

Unter Windows Sie haben auch mehrere Runtimes, LocalAlloc, GlobalAlloc, HeapAlloc (mit mehreren Haufen, die Sie leicht erstellen können), und so weiter.

Sie müssen immer freigeben Speicher mit der richtigen Freigabefunktion für die allocator Sie verwendet haben. Also, entweder das Teil des Programms verantwortlich für die Zuteilung des Speichers sollte auch den Speicher frei, oder Sie müssen die richtige Freigabefunktion (oder einen Wrapper um es), um den Code übergeben, die den Speicher werden frei.

Sie können auch die ganze Frage durch entweder vermeiden Sie den Zeiger erfordern immer mit einem bestimmten allocator zugeteilt werden oder durch die Bereitstellung von allocator selbst (in Form einer Funktion, um den Speicher zuzuweisen und möglicherweise eine Funktion um sie zu lösen). Wenn Sie das allocator selbst bieten, können Sie sogar Tricks (wie getaggten Zeiger) ein, damit auch statische Zuordnung verwenden (aber ich werde nicht in die Details dieses Ansatzes geht hier).

Raymond Chen einen Blog-Post hat darüber (Windows-centric, aber die Konzepte sind überall gleich): zugeordnet und freigegeben Speicher über Modulgrenzen

Andere Tipps

Der ACE Bibliothek tut dies ganz über den Platz. Sie können in der Lage sein zu überprüfen, wie sie es tun. Im Allgemeinen sollten Sie wahrscheinlich nicht brauchen dies allerdings in erster Linie zu tun ...

Seit dem heap, den stack und den statischen Datenbereich in der Regel besetzen verschiedene Bereiche des Gedächtnisses, es ist möglich, mit intimen Kenntnisse des Prozess-Speichers anzeigen, um sich die Adresse und bestimmen, welche Zuordnung Gebiet ist es in.Diese Technik ist sowohl Architektur und compiler-spezifisch, so dass es macht das portieren von code erschwert.

Die meist libc malloc Implementierungen Arbeit durch einen Header vor jedem zurückSpeicherBlock zu speichern, die Felder hat (vom free () Aufruf verwendet werden), die Informationen über die Größe des Blockes, sowie einen ‚magischen‘ Wert hat. Dieser Wert ist Magie zum Schutz vor dem Benutzer versehentlich einen Zeiger zu löschen, die nicht alloc'd wurden (oder einen Block zu befreien, die durch die Benutzer überschrieben wurden). Es ist sehr systemspezifisch, so dass Sie bei der Umsetzung Ihrer libc Bibliothek aussehen müsste, genau zu sehen, was Magie Wert war.

Wenn Sie wissen, dass Sie den angegebenen Zeiger zurück zu Punkt auf Kopf bewegen und überprüfen Sie es dann für den magischen Wert.

Können Sie in malloc Haken () selbst, wie die malloc Debugger tun, mit LD_PRELOAD oder so etwas? Wenn ja, könnten Sie eine Tabelle aller zugewiesenen Zeiger halten und verwenden. Ansonsten bin ich nicht sicher. Gibt es eine Möglichkeit an malloc der Buchhaltung Informationen?

Nicht als Standardfunktion.
Eine Debug-Version Ihrer malloc Bibliothek könnte eine Funktion hat, dies zu tun.

Sie können die Adresse auf etwas vergleichen Sie wissen, statisch zu sein, und sagen, es malloced ist nur, wenn es weit weg ist, wenn Sie den Bereich wissen sollte es kommen, aber wenn ihr Umfang nicht bekannt ist, kann man nicht wirklich Vertrauen das.

1.) Besorgen Sie sich eine Map-Datei für den Code u haben.

.

2), um die zugrunde liegende Prozess / Hardware-Zielplattform sollte eine Speicherkartendatei haben, die typischerweise an - Startadresse des Speichers (Stapel, Haufen, global0, Größe dieses Blocks, Lese-Schreib-Attributen dieses Speicherblocks

3). Nachdem sie die Adresse der Objekt (Zeigervariable) aus der MAO-Datei in 1) versuchen, um zu sehen, welchen Block der Adresse fällt. u könnte eine Vorstellung bekommen.

= AD

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