2016-07-04 8 views
-2

ich versuche String-Klasse in C++,Strings Hinzufügen Core Dump

#ifndef STRING 
# define STRING 
class String{ 
    private: 
     char *Buffer = new char; 

     inline unsigned long Length(const char *); 
     inline unsigned long Length(char *); 

     inline unsigned long Length(String); 
     inline unsigned long Length(String *); 
    public: 
     ~String(void){ 
      delete Buffer; 
     } 

     unsigned long Size = 0; 

     void Equal(const char *); 
     void Equal(char *); 

     void Equal(String *);  
     void Equal(String); 

     char *Get(void); 

     //Something is wrong in Add method. 
     char *Add(const char *); 
     char *Add(char *); 

     char *Add(String *); 
     char *Add(String); 
     //Something is wrong in Add method 

     char *Multiply(unsigned long *);  
     char *Multiply(unsigned long); 

     char& operator[](const unsigned long Index); 
     const char& operator[](const unsigned long Index) const; 
}; 
# include "StringIO.hpp" 
#endif 

StringIO.hpp umzusetzen:

#ifndef STRINGIO 
# define STRINGIO 

inline unsigned long String::Length(String S){return S.Size;} 
inline unsigned long String::Length(String *S){return S->Size;} 
void String::Equal(String S){this->Equal(S.Buffer);} 
void String::Equal(String *S){this->Equal(S->Buffer);} 

inline unsigned long String::Length(const char *S){ 
    unsigned long Count = 0; while(S[Count] != '\0'){ Count++;} return Count; 
} 

inline unsigned long String::Length(char *S){ 
    unsigned long Count = 0; while(S[Count] != '\0'){ Count++;} return Count; 
} 

void String::Equal(const char *S){ 
    unsigned long Count = 0; while(Count <= this->Length(S)){ 
     this->Buffer[Count] = S[Count]; 
     Count++; 
    } this->Size = Count - 1; 
} 

void String::Equal(char *S){ 
    unsigned long Count = 0; while(Count <= this->Length(S)){ 
     this->Buffer[Count] = S[Count]; 
     Count++; 
    } this->Size = Count - 1; 
} 

char *String::Get(void){ return this->Buffer;} 

/*Something is wrong in here*/ 
char *String::Add(String *S){return Add(S->Buffer);} 
char *String::Add(String S){return Add(S.Buffer);} 

char *String::Add(const char *S){ 
    char *Copy = this->Get(); for(unsigned long Count = 0; Count <= Length(S); Count++){ 
     Copy[this->Size + Count] = S[Count]; 
    } return Copy; 
} 

char *String::Add(char *S){ 
    char *Copy = this->Get(); for(unsigned long Count = 0; Count <= Length(S); Count++){ 
     Copy[this->Size + Count] = S[Count]; 
    } return Copy; 
} 
/*Something is wrong in here*/ 

#endif 

Ich schreibe ein Verfahren zum Hinzufügen Streicher und ein einfaches Programm, das Hinzufügen Strings mit dieser Methode und druckt sie auf Bildschirm:

int main(void){ 
    String *X = new String; 
    String *Y = new String; 

    X->Equal("Hello world!\n"); 
    Y->Equal("Hello world!\n"); 

    std::cout << X->Add(Y); 

    delete X; delete Y; //The line giving crash 
    return 0; 

wird nicht Fehler kompilieren, aber wenn ich es laufen, gibt es co erneut Dump Fehler. Wie kann ich es beheben? Und sei gnädig, ich bin ein Anfänger in C++.

Bearbeiten:

Kein Problem.

+0

Ihr Code führt keine Begrenzungen für die Überprüfung und Dereferenzierung von Zeigern durch, die null sein können. Ich empfehle 1) eine weniger intensive und schwierige Aufgabe als eine String-Klasse zu übernehmen und 2) auf Pointer safety and bounds checking zu lesen. –

Antwort

3

Zuerst ordnen Sie Ihre String-Puffer mit:

char *Buffer = new char; 

aber dies weist nur ein einziges Zeichen, wenn Sie String-Klasse schreiben wollen, dann sollten Sie verwenden:

char *Buffer = new char[size]; 

und auch delete[] sollte auch die Zuordnung sein, wo Sie Ihrer String-Klasse einen Text (zB String-Literal) zuweisen.

Ihre ::Add Methode ist auch seltsam:

char *String::Add(const char *S){ 
    char *Copy = this->Get(); for(unsigned long Count = 0; Count <= Length(S); Count++){ 
    Copy[this->Size + Count] = S[Count]; 
    } return Copy; 
} 

wo ordnen Sie zusätzlichen Speicher für neue Zeichenfolge?

+0

@ A.Ite Warum haben Sie diese Antwort dann akzeptiert? –

Verwandte Themen