2009-03-25 6 views
1

Wie unterscheidet man Zeiger und Referenzen zur Laufzeit? Zum Beispiel, wenn ich einen Zeiger eines Datentyps freigeben wollte, ohne zu wissen, ob es ein Zeiger war oder nicht, wie würde ich das tun? Gibt es eine Methode, um festzustellen, ob eine Variable im Stack oder über malloc() zugewiesen wurde?Unterscheidung zwischen Zeiger und Referenz zur Laufzeit ANSI C++

void destInt(int* var) 
{ 
    free(var); 
} 


int num = 3; 
int &numRef = num; 
int* numPtr = (int*)malloc(sizeof(int)); 
*numPtr = num; 

destInt(&numRef); //Syntactically correct but generates invalid pointer() 
destInt(numPtr); //Fine syntactically and logically 
+0

Dies ist nicht C. Oder es sieht nicht wie C. – strager

+0

C hat keine Referenzen ... –

+0

Auch Ihre "destInt (numRef);" ist syntaktisch überhaupt nicht korrekt. Eine Referenz kann nicht an eine Funktion übergeben werden, die ein int * akzeptiert. –

Antwort

7

Nein, nicht im allgemeinen Fall und nicht in einer tragbaren Art und Weise. Wenn Sie wissen, wo sich der Heap im Speicher befindet, können Sie eine fundierte Vermutung treffen, aber nicht auf eine zuverlässige Weise.

EDIT: Beachten Sie auch, dass C keine Referenzen hat. Der & -Operator in C wird verwendet, um die Adresse einer Variablen zu ermitteln.

4

Wenn es ANSI C ist, dann gibt es keine Referenz, daher sollten Sie Ihre Frage neu formulieren, um über Zeiger auf den Heap allocated oder Zeiger auf Stack zugeordnete Objekte zu sprechen.

Oft ist die Adresse des Heap 'klein' und wächst auf, und der Stack ist 'groß' und wird kleiner, aber das ist nur heuristisch und nicht portabel.

0

Bei Verwendung von malloc wird Speicher nicht im STACK, sondern im Heap reserviert.

1

In C++ ist die Information, die unterscheidet, ob es eine Referenz oder ein Zeiger ist, Teil der Typinformation zu Kompilierzeit. In C ist dies eine irrelevante Unterscheidung in der Semantik.

Wenn Sie & verwenden müssen, um die Adresse von etwas zu erhalten, dann können Sie nicht delete oder es frei. Andernfalls, wenn Sie einen Zeiger übergeben, müssen Sie dokumentieren, welche Funktionen die Berechtigung zu delete haben oder es freigeben. Der einfachste Weg, dies in C++ zu tun, ist die Verwendung einer Smart-Pointer-Klasse wie shared_ptr oder scoped_ptr.

1

Was auch immer Sie versuchen zu erreichen .... tun Sie es nicht so.

Sie können normalerweise die Grenzen des Stapels erhalten, aber das wäre normalerweise ein hübscher Compiler/Plattform-spezifischer Prozess. Gleiches mit dem Haufen. Wenn Sie neue und neue mit Ihren eigenen Versionen gehakt haben, wissen Sie wahrscheinlich, wo der Heap beginnt und endet. Sonst nicht.

Allerdings ist der Baum, den Sie bellen, nicht ein guter. Wenn Sie überzeugt sind, dass Sie dies wirklich tun müssen, übergeben Sie die Informationen mit dem Mauszeiger. Wickeln Sie es in eine Struktur, die auch einen bool namens needsFree oder etwas hat. Aber ansonsten deutet die Tatsache, dass Sie auf dieses Problem stoßen, darauf hin, dass das Problem, das Sie lösen möchten, auf eine sauberere Weise gelöst werden kann.