Speicherplatzreservierung dem Aufrufer überlassen?



  • Hallo,

    angenommen ich habe folgende kleine Datenstruktur:

    typedef struct intstack {
    	size_t size;
    	size_t capacity;
    	int *data;
    } intstack;
    
    intstack *intstack_new(size_t initial_capacity) {
    	intstack *intstack = malloc(sizeof(intstack));
    	intstack->size = 0;
    	intstack->capacity = initial_capacity;
    	intstack->data = malloc(initial_capacity * sizeof(int));
    	return intstack;
    }
    
    void intstack_free(intstack *intstack) {
    	free(intstack->data);
    	free(intstack);
    }
    
    void intstack_push(intstack *intstack, int value) {
    	if (intstack->size >= intstack->capacity) {
    		intstack->capacity *= 2;
    		intstack->data = realloc(intstack->data, intstack->capacity * sizeof(int));
    	}
    	intstack->data[intstack->size] = value;
    	++(intstack->size);
    }
    
    int intstack_pop(intstack *intstack) {
    	return intstack->data[--(intstack->size)];
    }
    

    Meine Frage lautet, ob es in Ordnung ist, dass ich in der intstack_new Funktion den Speicher für das struct selber reserviere (und in der intstack_free Funktion wieder freigebe), oder ob ich das dem Aufrufer überlassen soll, sodass der intstack_new Funktion bereits eine Adresse zum struct übergeben wird? Gibt es hier irgendwelche Vorteile? Was ist in diesem Fall "best practice"?



  • schau doch erst mal, dass es dir nicht in z. 10 das programm zerschießt 🙄



  • 😮 übersehe ich da etwas? Beim einem kleinen Test hat alles prima geklappt.


  • Mod

    Der Intstack selbst sollte den Speicher für seine Interna reservieren. Er benutzt ihn, das heißt, er ist auch für diesen Speicher verantwortlich. Der Benutzer des Intstacks ist dafür verantwortlich, den Intstack korrekt zu benutzen (also inststack_new, intstack_free, usw. aufzurufen), ihn hat nicht zu interessieren, was der Intstack intern macht.

    Der Intstack kann und sollte intern die Speicherverwaltung an eine andere Ebene weiterleiten, da seine Hauptaufgabe nicht die Speicherverwaltung ist, sondern die Organisation von Daten. Diese weitere Ebene ist in diesem Fall bereits malloc/free, kann aber bei komplexeren Datenstrukturen auch noch einmal etwas anderes sein.



  • itnawk schrieb:

    Meine Frage lautet, ob es in Ordnung ist, dass ich in der intstack_new Funktion den Speicher für das struct selber reserviere (und in der intstack_free Funktion wieder freigebe), oder ob ich das dem Aufrufer überlassen soll, sodass der intstack_new Funktion bereits eine Adresse zum struct übergeben wird? Gibt es hier irgendwelche Vorteile? Was ist in diesem Fall "best practice"?

    Kannst ja auch beide Varianten anbieten. 🙂 Wenn man sich entscheiden muss, spräche vielleicht für die zweite, dass der Benutzer entscheiden kann, ob er die struct nicht lieber auf den Stack legt, anstatt dass ihm pauschal ein weiteres malloc aufgezwungen wird. Auf die richtige Benutzung muss so oder so geachtet werden, von daher ist mit der Variante im Eingangspost im Vergleich auch nicht viel gewonnen.


Anmelden zum Antworten