Ist es gut, das dem Stack zugeordnete Objekt als Zeigerparameter an eine andere Funktion zu senden?

7

Ist es gut, das dem Stapel zugeordnete Objekt als Zeigerparameter an eine andere Funktion zu senden?

    
yesraaj 13.04.2009, 08:03
quelle

6 Antworten

12

Ja, aber das üblichere C ++ - Idiom für diese Situation ist die Verwendung einer Referenz (und wahrscheinlich einer Konstantenreferenz) anstelle eines Zeigers. Also statt

%Vor%

Sie schreiben:

%Vor%

Das hat den Vorteil, dass Sie das Objekt im Aufrufer nicht dereferenzieren müssen:

%Vor%

und gibt dem Leser auch einen unterschwelligen Hinweis, dass Sie nicht beabsichtigen, dass die Funktion das Eigentum an dem Objekt übernimmt.

    
anon 13.04.2009, 08:12
quelle
10

Wenn Sie sicher sind, dass der Aufruf synchron ist, ist es absolut zulässig, die Adresse des Stack-zugewiesenen Objekts an die Funktion zu senden. Wenn der Aufruf asynchron ist (dh die Funktion, die Sie aufgerufen haben, übergibt den Zeiger an einen anderen Thread), entstehen Probleme, da Sie möglicherweise versuchen, auf die Speicheradresse des anderen Threads zuzugreifen, selbst nachdem das zugeordnete Stack-Objekt gelöscht wurde. p>     

Naveen 13.04.2009 08:05
quelle
6

Solange die empfangende Funktion nicht davon ausgeht, dass sie Eigentümer der Ressource wird (und versucht, sie freizugeben), sicher. Eine Referenz könnte jedoch eine bessere Idee sein.

    
Assaf Lavie 13.04.2009 08:07
quelle
2

Das ist völlig in Ordnung für einen synchronen Funktionsaufruf. Wenn der Aufruf asynchron ist, kann dies zu einem Absturz führen, wenn das Stapelobjekt gelöscht wird, wenn es den Gültigkeitsbereich verlässt.

    
Canopus 13.04.2009 08:07
quelle
2

Sie sollten darauf achten, diesen Zeiger nicht für die weitere Verwendung zu speichern. Zum Beispiel:

%Vor%     
Sad Developer 13.04.2009 10:02
quelle
1

Es ist sicherlich gültig, aber mit vielen Vorbehalten. Hier sind die wichtigsten Dinge zu beachten (einige bereits von anderen erwähnt, andere nicht.)

  • Der Zeiger an sich kann bedeuten, dass der Ressourcenbesitz an den Angerufenen weitergegeben wird (d. h. er muss ihn nach der Verwendung freigeben). Hier ist eine Referenz vorhanden.
  • In vielen Situationen ist die Funktion, die Sie aufrufen müssen, bereits definiert und Sie können sie nicht ändern. Sie müssen ihr Verhalten studieren und sicherstellen, dass sie nicht davon ausgeht, dass sie das Objekt besitzt, statisch speichert oder woanders kopiert.
  • Wenn die Funktion, die Sie aufrufen, einen Nullzeiger verwenden muss, um das Fehlen dieses Parameters anzuzeigen, haben Sie keine Wahl, einen Verweis zu verwenden.
  • Asynchrone Aufrufe sind absolut no-no (es sei denn natürlich, Sie blockieren, bis sie mit Ihrem lokalen Objekt fertig sind und dann zurückkehren).
  • Die aufgerufene Funktion sollte auf keinen Fall jemals über die Größe des fraglichen Objekts hinausgehen, dies wird Ihren Stack zerstören und fast sicher Ihr Programm zum Absturz bringen!
  • Das Aufrufen einer Funktion, die für den Zugriff auf Bytes jenseits der Größe des Objekts anfällig ist, kann eine Sicherheitslücke darstellen. In der Tat ist dies die gebräuchlichste Methode, um in sichere Systeme einzudringen. Dies wird Pufferüberlauf genannt. (über den Umfang Ihrer Frage hinaus, aber Sie können hier hier und hier )
Ash 13.04.2009 12:58
quelle

Tags und Links