错误调试断言失败。 BLOCK_TYPE_IS_VALID

时间:2017-01-25 15:12:02

标签: c++ string oop assertions

当我运行程序时,会出现一个带有“Debug Assertion Failed”消息的窗口。

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 个答案:

答案 0 :(得分:0)

因此,此代码中存在一些可能导致此特定错误的问题。当您尝试释放已损坏的内存时,会发生此错误。

我怀疑你的情况是operator==。这是String而不是const String&。不同之处在于,通过接收String,您可以复制操作数。这包括对作为原始指针的内部缓冲区的引用。因此,当该副本超出范围时,缓冲区就会被delete[]编辑。因此,当您尝试拨打operator+时,缓冲区不存在。然后,运行时通过断言消息提醒您未定义的行为。如果您传入了const String&,那么您将传递对无法更改的参数的引用,而不是复制。这样可以确保在方法结束时不会对其进行破坏,并且缓冲区不是delete[]

旁注:如果您将缓冲区切换为std::vector<char>而不是原始缓冲区,那么您可以更好地管理缓冲区,因为它管理自己的内存并且您不需要析构函数。< / p>