Frage

Ist das in c in Ordnung?

int *i;
// do stuff

i = NULL;

i = (int *) some_func();
// do stuff

if (i != NULL)
    free(i);

i = NULL;

// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
    free(i);

i = NULL;
War es hilfreich?

Lösung

1) Das hängt von dem Vertrag ab, den Sie mit SOLE_FUNC () haben. Wenn einige_func erwartet, dass Sie Free () mit seinem Rückgabewert anrufen, ist Ihr Code in Ordnung.

2) Es ist in Ordnung, wenn auch nicht besonders elegant, Variablen in C wiederzuverwenden. Im Allgemeinen ist es im Allgemeinen besser, verschiedene Variablen für verschiedene Zwecke zu verwenden. Aus Perspektive der Leistung und der Mem-Nutzung ist es völlig dasselbe.

Andere Tipps

Das hängt davon ab, was some_func() macht gerade. Wenn es den Speicher mit zuteilt malloc(), dann solltest du free() es, wenn du fertig bist. Wenn dies nicht der Fall ist, sollten Sie nicht. Siehe die Dokumentation der Funktion, um sicher zu sein.

Ich würde Edgars Antwort zweiten, aber auch beachten, dass der Test für Null hier unnötig ist:

if (i != NULL)
    free(i);

Weil frei (null) erlaubt ist.

Ihr Code sieht in Ordnung aus. Nach welchem ​​spezifischen Bit fragen Sie?Beachten Sie jedoch, dass, wenn die Funktion einen int * zurückgibt, keine Umwandlung erforderlich ist, und wenn dies nicht der Fall ist, sollten Sie sie wahrscheinlich keinem int * zuweisen.

Nun, das einzige Problem, das ich sehe, ist das Lesbarkeitsproblem, das nicht nur an C gebunden ist.

Wenn einige_Func einen Zeiger zurückgibt, der auf einen dynamisch zugeteilten Speicher hinweist, ja.

Es ist in Ordnung, solange einige_func () das tut, was es tun soll. Wenn es I eine ungültige (nicht zugewiesene) Adresse zuweist, wird Ihr Programm zum Absturz gebracht.

Hängt vom Vertrag von slow_func () ab.

Wenn einige_func () einen Speicher zuteilt und Ihre Verantwortung für die Veröffentlichung bezeichnet, ist es in Ordnung, es zu free (). In der Tat ist es ein Fehler, nicht.

Dies ist einer der Fehler der Arbeit in einer nicht verwalteten Sprache. Sie müssen nachverfolgen, welche Ressourcen Sie besitzen, und sicherstellen, dass Sie sie freigeben.

Wenn some_func() "besitzt" seine Daten und gibt nur Hinweise darauf zurück, damit Sie es inspizieren können. Sie sollten sie nicht befreien. Wenn es mallocs dat nur für Sie, dann sind Sie tatsächlich dafür verantwortlich für das Durchführen des free

In Ihrem ersten Schritt

int *i;
// do stuff

i = NULL;

Wenn ich auf etwas hingewiesen habe, das Speicher zugewiesen hat, wird diese Erinnerung nicht für immer verloren (Speicherleck)?

Zum Beispiel:

int *i;
i = (int*) malloc(sizeof(int);
i = NULL;

Würde einen Teil des Gedächtnisses von der Größe des linken Links im Äther hinterlassen.

Gleiches gilt für Ihre Beispiele für Ihre seltsamen Beispiele, aber ich denke, Sie testen richtig, um zu versuchen, alles zu befreien, was auch immer zurückgelassen wird. Vor allem, wenn Sie nicht wissen, wie slow_func () funktioniert.

Wenn sich smil_func () aus einer Bibliothek stammt, gibt es möglicherweise eine Funktion free_some_func (i), die die Arbeit für Sie erledigt.

i = (int *) some_func();

Sie haben nicht gesagt, was die Rückkehr -Art von some_func() ist, aber der (int *) Teil ist ein bisschen misstrauisch. C ist im Allgemeinen ziemlich nachsichtig in Bezug auf diese Dinge und kompiliert normalerweise sauber, ohne dass eine explizite Besetzung erforderlich ist. Wenn dies nicht der Fall ist, überlegen Sie sich sorgfältig, ob das, was Sie tun, so gut definiert und tragbar ist, wie Sie es möchten.

@Kevin Montrose: Hmmm.yeah, die Programmierer, die kompetent werden müssen, ist ein echter Deal-Breaker. Vielleicht sollten wir alle Helme tragen, während wir den Codesschlingen, nur für den Fall, dass die Decke hereinfällt. Und was ist der "Vertrag" von "Vertrag" some_func? some_func Entweder gibt es einen Wert zurück, der an freie geleitet wird, oder dies nicht. Dort gibt es keinen "Vertrag". Aber dann bin ich ein alter Furz und glaube nicht an Verschleierung, um Brownie -Punkte mit dem Management zu gewinnen. Dies sind einfache Konzepte.

@CAF: Dies ist wahrscheinlich Compiler/Bibliotheksabhängig. Es ist sicherer zu überprüfen, wie er es tut. Nur weil Ihre Implementierung kostenloser Schecks für einen Nullzeiger nicht bedeutet, dass dies alle dies tun.

Wenn Sie meinen, ist es in Ordnung, den INT -Zeiger wiederzuverwenden, anstatt mit jedem Gebrauch einen neuen zu deklarieren, sicher ist er in Ordnung, aber im Allgemeinen kann er verwirrend sein, wenn alle Ihre // do stuff besteht aus viel Code. Ein anderer Programmierer könnte verwirrt sein, wo *i kam aus und warum es hier und y da bedeutet.

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