Ist es eine gute Übung, den Zeiger von der Funktion in c zurückzugeben?

7

Für Beispiel:

%Vor%

Ich frage mich, ob dies eine gute Übung in c ist?

    
root 08.11.2010, 00:07
quelle

7 Antworten

13

Das Zurückgeben von Zeigern ist ziemlich üblich. Das Problem oder die erforderliche Disziplin besteht darin, sicher zu sein, wo die Verantwortung für die Befreiung der Erinnerung liegt. Dieses Beispiel riecht, weil es nicht klar ist, dass es in main () frei sein muss.

    
DGM 08.11.2010, 00:12
quelle
8

Ich denke, das Problem ist das freie (a); Ich denke, du solltest eine release_point () -Funktion hinzufügen.

    
DaVinci 08.11.2010 00:12
quelle
5

Sehen Sie sich das C-Beispiel auf der Wikipedia-Seite für opake Zeiger an. Es ist eine Möglichkeit, Code zu strukturieren, bei dem Sie den Speicher auf einer Seite der Schnittstelle vollständig verwalten.

    
Laserallan 08.11.2010 00:12
quelle
3

Die einzige wirkliche Gefahr, die ich kenne, wenn ich einen Zeiger auf zugewiesenen Speicher zurückgebe, ist: Wenn Ihre Bibliothek unter Windows kompiliert und beispielsweise mit einer Instanz der Visual C ++ - Laufzeitbibliothek (MSVCRT) verknüpft ist, ist sie statisch verknüpft Wenn ein Clientprogramm mit einer anderen Instanz verknüpft ist, z. B. mit der DLL verknüpft ist, haben sie jeweils eine andere malloc-Arena, und Zeiger, die von der Bibliothek zurückgegeben werden, können nicht vom Programm freigegeben werden. Jeder Versuch, dies zu tun, führt wahrscheinlich zum Absturz des Programms.

    
Martin Broadhurst 08.11.2010 00:16
quelle
3

Ich befürworte immer, dass Sie Ihre eigene Funktion haben, um Speicher freizugeben, der von Ihrer Bibliothek zurückgegeben wird, es sei denn, Sie geben etwas Triviales wie einen String zurück.

Der Grund dafür ist, dass, wenn Sie die Struktur der zurückgegebenen Elemente so ändern, dass eine einfache free nicht mehr ausreicht (weil Sie den zurückgegebenen Objekt-Zeigern zugewiesenen Speicher hinzufügen, die selbst freigegeben werden müssen) ), müssen Kunden ihren Code nicht ändern; Sie können nur Ihre bestehende freie Funktion ändern.

Wenn Sie also eine eigene freie Funktion haben, werden Clients von der Struktur der von Ihrer Bibliothek zurückgegebenen Objekte isoliert, sodass Sie die Struktur Ihrer Objekte ändern können, ohne die Clients zu beeinflussen.

    
Martin Broadhurst 08.11.2010 00:29
quelle
1

Wenn Sie ein konsistentes System wissen, welche Funktionen Zeiger zurückgeben, die freigegeben werden müssen (z. B. das Wort create oder new im Namen der Funktion verwenden), erleichtert dies die Verwaltung Ihres Speichers.

> %Vor%     
dreamlax 08.11.2010 00:13
quelle
0

Es ist oft eine gute Übung, aber Ihr Beispiel ist einer der wenigen Fälle, in denen es sehr schlecht ist. Sie sollten niemals dynamische Zuordnungen und Zeiger für einzelne Objekte verwenden, die klein sind und Zeiger selbst nicht enthalten (und niemals enthalten müssen). Das Erhalten eines 4-byte int mit malloc verwendet mindestens 16 Bytes, wenn Sie den Buchhaltungsaufwand berücksichtigen, aber vielleicht noch viel wichtiger, bedeutet das, dass Sie sich über mögliche Zuteilungsfehler (und wie Sie damit umgehen müssen) Sorgen machen müssen um das Objekt zu befreien.

Einige Beispiele für Objekte, die Sie nicht wie folgt zuordnen sollten:

  • jeder Basistyp
  • geordnete Paare / Koordinaten / Vektoren / Matrizen / etc. (solange sie eine feste Dimension haben)
  • IP-Adressen
  • Farbwerte

Natürlich ist die einmalige Zuweisung und Rückgabe eines Zeigers an solche Objekte sinnvoll, wenn Sie ein Array von ihnen zuweisen.

    
R.. 08.11.2010 03:47
quelle

Tags und Links