2016-05-17 10 views
0

Ich habe diese Klasse für den Eingang sparen:derzeit keine Speicherfehler in einer Struktur in einer Klasse erreichen

class Recept { 
    int Ingr_size; 
    char *Name; 
    char *Type; 
    char *Recipe; 
    struct Ingridient { 
     char *aName; 
     float Mas; 

    } *List_ingr; 

, wenn ich mit dieser Funktion Zutat Namen oder Masse versuchen zu sparen:

void Recept::setIngr(const char * p, float mass) { 
    struct Ingridient * temp = new struct Ingridient[Ingr_size + 1]; 
    if (Ingr_size) { 
     for (int i = 0; i < Ingr_size; i++) 
      temp[i] = List_ingr[i]; 
     delete List_ingr; 
     List_ingr = temp; 
    } 
    List_ingr[Ingr_size].aName = new char[strlen(p) + 1]; 
    strcpy(List_ingr[Ingr_size].aName, p); 
    List_ingr[Ingr_size].Mas = mass; 
} 

Ich erhalte die Fehlermeldung, dass "aName Speicher" & "Mas Speicher nicht erreicht werden kann".

Ich kann das Problem nicht finden, wo oder warum.

Vielen Dank.

+1

Warum bist du nicht mit 'std :: vector' oder' std :: string'? – trojanfoe

+0

Auch das Schlüsselwort 'struct' wird nicht benötigt, wenn es in C++ instanziiert wird. Und Sie können 'std :: list' oder' std :: vector' verwenden, um Ihre Ingridient-Liste zu verwalten, anstatt mit dem rohen Array zu arbeiten – Garf365

Antwort

0

Ich erhalte die Fehlermeldung, dass "keinName Speicher erreicht werden kann" & "Kann Mas Speicher nicht erreichen".

dies eine Laufzeitausnahme wird, haben Sie Ihre Klassenvariablen nicht initiaized, Sie mindestens einen Konstruktor benötigen die grundlegenden Standard initailizations tun:

Recept() : Ingr_size(0), List_ingr(nullptr){} 

auch List_ingr wird, falls nullptr sollten Sie nicht versuch es in setIngr zu wiederholen.

[Bearbeiten]

Wenn Sie Konstruktor, wie oben in der Klasse haben (was nicht in der Frage ist), dann Sie andere Fehler haben, siehe unten Kommentare:

void Recept::setIngr(const char * p, float mass) { 
    struct Ingridient * temp = new struct Ingridient[Ingr_size + 1]; 
    if (Ingr_size) { 
     for (int i = 0; i < Ingr_size; i++) 
      temp[i] = List_ingr[i]; 
     delete List_ingr; 
     List_ingr = temp; 
    } 
    else { 
     // !!! in case of Ingr_size you still need to set List_ingr, 
     List_ingr = temp; 
    } 
    List_ingr[Ingr_size].aName = new char[strlen(p) + 1]; 
    strcpy(List_ingr[Ingr_size].aName, p); 
    List_ingr[Ingr_size].Mas = mass; 

    // !!! You need to increment size 
    Ingr_size++; 
} 
+1

Ein Destruktor würde auch nicht weh tun, wenn 'new' zur Zuweisung von Ressourcen verwendet wird. – trojanfoe

+0

Und in diesem Fall ist sicherer einen 'std :: list' zu verwenden, um die Zutatenliste – Garf365

+0

@trojanfoe auch eine Kopie Zuordnung zu verwalten, und eine Kopie Konstruktor (siehe http://stackoverflow.com/questions/4172722/what -is-the-Regel-of-three) – Garf365

Verwandte Themen