2017-01-25 21 views
-2

Когда я запускаю свою программу, появляется окно с сообщением «Debug Assertion Failed».Ошибка подтверждения отладки. BLOCK_TYPE_IS_VALID

Source.cpp

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

using namespace std;  
String :: String()  
{  
    this->s=new char[50]; 
} 

String :: String(char *sir)  
{  
    this->s=new char[strlen(sir)+1]; 
    strcpy_s(this->s, strlen(sir)+1, sir); 
} 

String :: ~String()  
{  
    delete [] s; 
} 

String& String:: operator=(String &sir)  
{  
    strcpy_s(this->s, strlen(sir.s)+1, sir.s); 
    return *this; 

} 

String String:: operator+(String sir)  
{  
    String rez; 
    rez.s=new char [strlen(s)+strlen(sir.s)+1]; 
    strcpy_s(rez.s, strlen(s)+1,s); 
    strcat_s(rez.s, strlen(s)+strlen(sir.s)+1, sir.s); 
    return rez; 

} 

void String:: afisare()  
{  
    cout << s<< endl; 
} 

bool String:: operator==(String sir)  
{  
    if(strcmp(s, sir.s)==0) 
     return true; 
    else 
     return false; 
}` 

main.cpp

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

using namespace std; 

int main()  
{ 
    String sir1("John "); 
    String sir2("Ola "); 
    String rez; 
    if(sir1==sir2) 
     cout << "string are identicaly"<< endl; 
    else 
     cout << "strings are not identicaly"<< endl; 

    rez=sir1+sir2; // this line i have debug assertion failed 
    rez.afisare(); 
    return 0; 
} 
+1

'String & String :: operator = (String & sir)' что происходит, когда 'strlen (sir.s) + 1' больше, чем' this-> s' – lcs

+3

Читайте о * правиле три/пять/ноль * , – Quentin

+0

Вам также не нужен конструктор копирования. 'String (const String & sir)'. – PaulMcKenzie

ответ

0

Итак, есть несколько вопросов, в этом коде, которые могут привести к этой конкретной ошибке. Ошибка возникает при попытке освободить память, которая была повреждена.

Я подозреваю, что в вашем случае это происходит в вашем operator==. Это занимает String вместо const String&. Разница в том, что, взяв String, вы делаете копию операнда. Это включает ссылку на внутренний буфер, в котором вы являетесь сюжетом, как необработанный указатель. Таким образом, когда эта копия выходит за пределы области видимости, тогда буфер составляет delete[] ed. Таким образом, к тому моменту, когда вы пытаетесь вызвать свой operator+, буфер не существует. Затем среда исполнения предупреждает вас о неопределенном поведении с помощью сообщения об утверждении. Если вместо этого вы перешли в const String&, вы передадите ссылку на параметр, который нельзя изменить, а не делать копию. Это гарантирует, что оно не будет разрушено в конце метода, а буфер не будет delete[] ed.

Сторона примечания: если вы переключили буфер на std::vector<char> вместо необработанного буфера, вам будет лучше служить, поскольку он управляет собственной памятью, и вам не понадобится деструктор.