2017-01-25 6 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

'strlen(sir.s)+ 1'が' this-> s 'よりも長いときにどうなるのでしょうか – lcs

+3

3/5/。 – Quentin

+0

コピーコンストラクタもありません。 'String(const String&sir)' – PaulMcKenzie

答えて

0

だから、この特定のエラーにつながる可能性があり、このコードではいくつかの問題があります。このエラーは、破損しているメモリを解放しようとしたときに発生します。

あなたのケースでは、これはあなたのoperator==で起こっていると思われます。これはconst String&の代わりにStringになります。違いは、Stringを受け取ることによって、オペランドのコピーを作成していることです。これには、生のポインタとしてのストーリーである内部バッファへの参照が含まれます。したがって、コピーが範囲外になると、bufferはdelete[]になります。したがって、あなたがoperator+に電話をかけようとしている頃には、そのバッファは存在しません。ランタイムは、アサーションメッセージを介して未定義の動作を警告します。代わりにconst String&を渡すと、コピーを作成するのではなく変更できないパラメータへの参照が渡されます。これにより、メソッドの最後に破棄されず、バッファがdelete[]でないことが保証されます。

サイドノート:バッファをrawバッファの代わりにstd::vector<char>に変更した場合、そのバッファが自分のメモリを管理し、デストラクタを必要としなくなるので、より効果的です。

関連する問題