2017-02-03 4 views
-6

Das ist meine Klasse und mein Problem ist, wenn ich den Konstruktor rufenMein Programm stoppt

Eveniment e1 (1, m1);

mit Parametern in der Hauptmethode, stoppt mein Programm und ich weiß nicht warum. M1 ist ein Objekt von IntrareCalendar.

class Eveniment{ 
private: 
    const int id; 
    IntrareCalendar data; 
    char* detalii; 
    int static nrIntrari; 

public: 
    Eveniment(int nr,IntrareCalendar ic) :id(nr){ 
     this->data = ic; 
     nrIntrari++; 
    } 

    ~Eveniment(){ 
     if (this->detalii != NULL) 
      delete[]this->detalii; 

    } 
}; 

Was soll ich tun? Danke vielmals!

+1

Fragen, die Debugging-Hilfe suchen ("** warum funktioniert dieser Code nicht? **") müssen das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten Code zur Reproduktion ** in der Frage selbst enthalten ** . Fragen ohne ** eine klare Problemstellung ** sind für andere Leser nicht nützlich. Siehe: [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). – Biffen

+0

'* Was soll ich tun? *' Sie sollten [dies] lesen (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). – Biffen

+2

Worauf Biffen hinweist, ist, dass wir keine Definition für "IntrareCalendar ic" haben. Während es möglich ist, Fehler in diesem Code zu finden, wie geschrieben (wie Bathsheba auf ein Problem hingewiesen hat), stell dir vor, du hättest einen Copy-Konstruktor für IntrareCalendar, der 'while (true) {}' oder somesuch ... so sagt Endlosschleife auf 'this-> data = ic;'. Wir würden es nicht wissen. Wir wissen auch nicht, was "mein Programm aufhört" bedeutet - Endlosschleife? abstürzen? Weißt du, auf welcher Linie es abgestürzt ist? Berücksichtigen Sie diese Fragen, wenn Sie Fragen stellen ... geben Sie vollständigen Code und weitere Details an. – HostileFork

Antwort

5

Sie setzen nie detalii auf irgendeinen gültigen. Es bleibt nicht initialisiert - es ist nicht initialisiert auf einen bestimmten Wert automatisch. Sie können in Ihrem Konstruktor auf nullptr setzen. (Verwenden Sie nicht NULL in C++.)

Ihr Destruktor ruft delete[] auf diesem Mitglied, aber new[] wurde zuvor aufgerufen. Daher ist das Verhalten Ihres Programms nicht definiert.

Verwenden Sie auch static std::atomic<int> als Typ für nrIntarari, falls mehrere Threads eine Eveniment instanziieren.

+0

Vielen Dank, Gott segne dich! –

+2

Wenn Sie einen Destruktor benötigen, benötigen Sie außerdem einen Kopierkonstruktor und einen Zuweisungsoperator (Google "The Rule of Three"). Lieber 'detalii' als' std :: string' oder 'std :: vector ' deklarieren (abhängig von Ihren Bedürfnissen). Wenn Sie verzweifelt sind, deklarieren Sie es als 'std :: unique_ptr '. Mit jeder dieser Optionen benötigen Sie keinen Destruktor, und Kopieren/Zuweisen wird entweder korrekt funktionieren (string/vector) oder einfach nicht existieren (unique_ptr). Alle drei Auswahlmöglichkeiten hätten auch "detalii" korrekt initialisiert, so dass Sie kein Problem hätten. –

+2

Es stellt sich heraus, Sie müssen Google "Rule of Three C++" :-). Aber [hier] (http://en.cppreference.com/w/cpp/language/rule_of_three) ist ein guter Link. –