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.
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.
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.
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:
Natürlich ist die einmalige Zuweisung und Rückgabe eines Zeigers an solche Objekte sinnvoll, wenn Sie ein Array von ihnen zuweisen.