2016-03-25 4 views
0

Jedes Mal, wenn eine der String Destructor getroffen wird es eine Breakpoint- Trigger, ich glaube, ich könnte die gleiche Variable zweimal oder nicht zuweisen die richtige Menge an Speicher während der Manipulation von m_str werden LöschenWindows-Trigger Breakpoint- auf Array Deletion

#include "String.h" 
#include <iostream> 

using namespace std; 

String::String() 
{ 
    m_str = nullptr; 
} 

String::String(const char* newStr) 
{ 
    m_str = new char[strlen(newStr)+ 1];      
    strcpy(m_str, newStr);        
} 

String::~String() 
{ 
    if (m_str != nullptr) 
    { 
     delete[] m_str; 
    } 
} 

void String::operator=(const String & myString) 
{ 
    if (m_str != nullptr) 
    { 
     delete[] m_str;      //Breakpoint Apears Here 
    }; 
    m_str = new char[strlen(myString.m_str) + 1]; 
    m_str = myString.m_str; 
} 

void String::operator=(char* newStr) 
{ 
    if (m_str != nullptr) 
    { 
     delete[] m_str; 
    }; 
    m_str = new char[strlen(newStr) + 1]; 
    m_str = newStr; 
} 
} 
+1

Und was ist Ihre Frage? –

+0

Sie * müssen * einen Kopierkonstruktor haben, und für eine Ressource, die einen solchen Typ enthält, wäre ein Move-Konstruktor und ein Zuweisungsoperator sehr wünschenswert. (Move-Konstruktor: 'String (String && rhs): m_str (rhs.m_str) {rhs.m_str = nullptr;} '). –

+0

check rule of three und rule of five –

Antwort

0

Sie verwenden richtig ein strcpy Zeichen von den ursprünglichen char-Array kopieren in String::String(const char* newStr), aber in allen anderen Stellen im Code, Sie falsch schreiben:

m_str = new char[strlen(myString.m_str) + 1]; 
m_str = myString.m_str; 

Erste Zeile ordnet korrekt eine Reihe von richtigen Größe, aber die zweiten löscht die Stelle er durch neue erhalten so:

  • Sie einen Speicherverlust zu erhalten, da die zugewiesenen Speicher keinen Zeiger auf sie nicht mehr hat und wird nie
  • die m_str Mitglied verweist auf die ursprüngliche char-Array befreit werden. Wenn es später gelöscht wird, haben Sie einen baumelnden Zeiger, und wenn Sie diese Instanz zuerst löschen, werden Sie versuchen, den ursprünglichen Zeichenzeiger in einer anderen Instanz zu löschen, indem Sie ihn baumeln lassen, oder sogar versuchen, ein statisches oder lokales Array zu löschen.

TL/DR: konsequent Kopie das Zeichenfeld mit strcpy (oder std::copy)

0

einem const char * zum anderen zuordnen, wie Sie beispielsweise tun In den Zuweisungsoperatoren kopiert die Zeichenfolge nicht, es kopiert nur den Zeiger. Statt zweier separater Strings haben Sie nun zwei Zeiger, die auf denselben String zeigen.

Also, zum einen lekken Sie das neu erstellte char-Array und zum anderen versuchen Sie zu löschen, was an den Zuweisungsoperator übergeben wurde, was in Ihrem Fall wahrscheinlich ein String-Literal anstelle von etwas ist, das über new erstellt wurde . Auch im Fall des Kopierzuweisungsoperators würden Sie zwei String Objekte erhalten, die auf das gleiche char-Array zeigen und somit die Löschung doppelt durchführen.

Um dieses Problem zu lösen, verwenden Sie einfach strcpy wie im Konstruktor.