当我运行程序时,会出现一个带有“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;
}
答案 0 :(得分:0)
因此,此代码中存在一些可能导致此特定错误的问题。当您尝试释放已损坏的内存时,会发生此错误。
我怀疑你的情况是operator==
。这是String
而不是const String&
。不同之处在于,通过接收String
,您可以复制操作数。这包括对作为原始指针的内部缓冲区的引用。因此,当该副本超出范围时,缓冲区就会被delete[]
编辑。因此,当您尝试拨打operator+
时,缓冲区不存在。然后,运行时通过断言消息提醒您未定义的行为。如果您传入了const String&
,那么您将传递对无法更改的参数的引用,而不是复制。这样可以确保在方法结束时不会对其进行破坏,并且缓冲区不是delete[]
。
旁注:如果您将缓冲区切换为std::vector<char>
而不是原始缓冲区,那么您可以更好地管理缓冲区,因为它管理自己的内存并且您不需要析构函数。< / p>