struct und malloc - Was mache ich falsch?
-
Hallo Leute, ich stehe gerade irgendwie auf dem Schlauch. Ich dachte new und malloc machen das gleiche. Wahrscheinlich mache ich aber bei der Anwendung von malloc was falsch...
struct Verwaltung { std::vector<int> nummern; }; int _tmain(int argc, _TCHAR* argv[]) { struct Verwaltung* sv0 = new struct Verwaltung; sv0->nummern.push_back(0); struct Verwaltung* sv1 = (struct Verwaltung*)malloc(sizeof(struct Verwaltung)); printf("Hier 0\n"); sv1->nummern.push_back(0); //Crash... printf("Hier 1\n"); system("pause");Ausgabe:
Hier 0Wieso geht das mit new aber mit malloc nicht? Mache ich etwas falsch?
MfG
-
SchlechterInformatiker schrieb:
Ich dachte new und malloc machen das gleiche.
Nö.
Malloc ruft insbesondere keine Konstruktoren auf. Darum ist malloc nur für POD geeignet.
-
newist C++ und ruft vorhandende Konstruktoren korrekt auf, z.B. vonstd::vector.
mallocist C und kennt keine Konstruktoren. Demenstsprechend werden Objekte, deren Klassen konstruktoren haben, nicht korrekt konstruiert.
-
Dafür gibt es Placement-New. Das ruft für dich den Constructor auf und erstellt ein Objekt in einem vorher bereit gestellten Speicherbereich.
Das ist übrigens der einzige Fall, wo es erlaubt ist den Destruktor explizit aufzurufen. Erlaubt sind verbotene Dinge immer dann, wenn es keinen anderen Weg dafür gibt. Sprich es gibt kein Placement-Delete.
-
Ja ok, sowas dachte ich mir fast schon. Aber wenn ich malloc benutze, dann müsste es doch möglich sein,
dass ich den Konstruktor von std::vector<int> selber aufrufe, oder?
Also hoffentlich blamiere ich mich jetzt nicht:struct Verwaltung { std::vector<int> nummern; }; int _tmain(int argc, _TCHAR* argv[]) { struct Verwaltung* sv0 = new struct Verwaltung; sv0->nummern.push_back(0); struct Verwaltung* sv1 = (struct Verwaltung*)malloc(sizeof(struct Verwaltung)); sv1->nummern = std::vector<int>(); printf("Hier 0\n"); sv1->nummern.push_back(0); //Crash... printf("Hier 1\n"); system("pause");Das stürzt aber genauso ab...
-
SchlechterInformatiker schrieb:
Aber wenn ich malloc benutze, dann müsste es doch möglich sein,
dass ich den Konstruktor von std::vector<int> selber aufrufe, oder?Du rufst da aber nicht nur den Konstruktor auf, sondern auch den Zuweisungsoperator. Von einem Vector, dessen Konstruktor nie aufgerufen wurde.
Das Stichwort placement new hast du ja schon bekommen.
-
Ja ok, dann hab ich wohl irgendwann mal was falsch verstanden. Dann benutz ich halt das ganz normale new und lass die Finger von alten C-Reliketen und gut is...
Vielen Dank!
-
Lass das
newganz weg, gerade inmainbraucht es das wirklich nicht.struct Verwaltung { std::vector<int> nummern; }; int main() { Verwaltung sv0; sv0.nummern.push_back(0); Verwaltung sv1; sv1.nummern.push_back(0); std::cout << "Hier fertig" << std::endl; }