Frage

  

Mögliche Duplikate:
   Wie kann ich die Größe eines Arrays von einem Zeiger in C?
   Gibt es eine Möglichkeit, programmgesteuert die Größe eines C ++ Array zu bestimmen? Und wenn nicht, warum?

ich einen Zeiger auf ein Stück zugewiesenen Speicher aus einer C-Stil-Funktion. Nun wäre es wirklich interessant für Debugging-Zwecke zu wissen, wie groß der zugeordneten Speicherblock, dass dieser Zeiger ist.

Gibt es etwas eleganter als eine Ausnahme zu provozieren, indem über seine Grenzen blind ausgeführt wird?

Vielen Dank im Voraus, Andreas

EDIT:

Ich benutze VC ++ 2005 auf Windows und GCC 4.3 auf Linux

EDIT2:

Ich habe unter VC ++ 2005 _msize Leider kommt es zu einer Ausnahme im Debug-Modus ....

EDIT3:

Well. Ich habe die Art und Weise habe ich versucht, mit der Ausnahme, oben beschrieben, und es funktioniert. Wenigstens während ich das Debuggen und dass unmittelbar nach dem Aufruf zu gewährleisten der Bibliothek Ausfahrten betreibe ich über den Puffergrenzen. Funktioniert wie ein Zauber.

Es ist einfach nicht elegant und in keiner Weise verwendbar in Produktionscode.

War es hilfreich?

Lösung

Es ist nicht Standard, aber wenn Ihre Bibliothek eine msize() Funktion hat, die Größe geben wird.

Eine gemeinsame Lösung ist malloc mit Ihrer eigenen Funktion zu wickeln, das jede Anforderung zusammen mit der Größe und die daraus resultierenden Speicherbereich, in dem Release-Build-Protokolle können Sie auf die ‚echten‘ malloc wechseln.

Andere Tipps

Wenn Sie nicht schmierigen Gewalt zum Zwecke der Fehlersuche dagegen haben, können Sie Makros #define Anrufe malloc einzuhaken und frei und Pad die ersten 4 Bytes mit der Größe.

Nach der Melodie von

void *malloc_hook(size_t size) {
    size += sizeof (size_t);
    void *ptr = malloc(size);
    *(size_t *) ptr = size;
    return ((size_t *) ptr) + 1;
}

void free_hook (void *ptr) {
    ptr = (void *) (((size_t *) ptr) - 1);
    free(ptr);
}

size_t report_size(ptr) {
    return * (((size_t *) ptr) - 1);
}

dann

#define malloc(x) malloc_hook(x)

und so weiter

Die C-Laufzeitbibliothek bietet keine solche Funktion. Darüber hinaus bewusst eine Ausnahme zu provozieren werden Ihnen nicht sagen, wie groß der Block entweder ist.

Normalerweise ist die Art und Weise dieses Problem in C gelöst wird, ist eine separate Variable zu erhalten, die den Überblick über die Größe des zugeordneten Blockes hält. Natürlich ist dies manchmal unbequem ist, aber es gibt im Allgemeinen keine andere Art und Weise zu kennen.

Ihre C-Laufzeitbibliothek können einige Heap-Debug-Funktionen bereitstellen, die Blöcke zugewiesen Abfrage kann (immerhin free() wissen muss, wie groß der Block ist), aber jede dieser Art der Sache wird nonportable .

Mit gcc und der GNU linker, können Sie leicht wickeln malloc

#include <stdlib.h>
#include <stdio.h>


void* __real_malloc(size_t sz);
void* __wrap_malloc(size_t sz)
{
    void *ptr;

    ptr = __real_malloc(sz);
    fprintf(stderr, "malloc of size %d yields pointer %p\n", sz, ptr);

    /* if you wish to save the pointer and the size to a data structure, 
       then remember to add wrap code for calloc, realloc and free */

    return ptr;
}

int main()
{
    char *x;
    x = malloc(103);

    return 0;
}

und kompiliert mit

gcc a.c -o a -Wall -Werror -Wl,--wrap=malloc

(Natürlich wird dies auch mit c ++ Code mit g kompilierte arbeiten ++ und mit dem neuen Betreiber (durch ist es verstümmelte Name), wenn Sie möchten.)

In der Tat, die statisch / dynamisch geladene Bibliothek wird auch Ihre __wrap_malloc verwenden.

Nein, und Sie können nicht auf eine Ausnahme verlassen, wenn seine Grenzen Überholkupplung, es sei denn, es ist in der Dokumentation der Implementierung des. Es ist ein Teil der Dinge, die Sie wirklich Programme nicht wissen müssen, um darüber zu schreiben. Dig in Ihren Compiler in der Dokumentation oder Quellcode, wenn Sie wirklich wissen wollen.

Es gibt keine Standard-C-Funktion, dies zu tun. Je nach Plattform kann es zu einer nicht tragbaren Methode sein - was für OS und C-Bibliothek verwenden Sie

Beachten Sie, dass eine Ausnahme zu provozieren unzuverlässig ist -. Es nach dem Brocken sofort andere Zuordnungen sein können Sie haben, und so könnten Sie nicht eine Ausnahme erst lange erhalten, nachdem Sie die Grenzen Ihrer aktuellen Chunk überschreiten

Speicher Kontrolleure wie Valgrind der memcheck und Google TCMalloc (der Teil Haufen checker) diese Art der Sache zu verfolgen.

Sie können TCMalloc verwenden, um einen Heap-Profil zu entleeren, das zeigt, wo die Dinge zugeordnet wurde, oder Sie können es nur um sicher zu machen überprüfen Sie Ihre Heap das gleiche an zwei Punkten in der Programmausführung ist mit SameHeap () .

Teillösung. Unter Windows können Sie die PageHeap verwenden, um einen Speicherzugriff außerhalb des zugewiesenen Block fangen

PageHeap ist eine alternativer Speichermanager in Windows-Kernel (in den NT-Sorten, aber niemand sollte eine andere Version heute verwendet). Es nimmt jede Zuordnung in einem Prozess und gibt einen Speicherblock, dessen Ende mit dem Ende einer Speicherseite ausgerichtet hat, dann macht es die folgende Seite unaccessible (kein Lesen, kein Schreibzugriff). Wenn das Programm versucht, über das Ende des Blocks zu lesen oder schreiben, erhalten Sie eine Zugriffsverletzung erhalten Sie mit Ihrem Lieblings-Debugger fangen kann.

Wie es zu bekommen: Download und die Paket-Debugtools für Windows von Microsoft installieren:

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