我定义了自己的字符串类 MyString。一切正常,直到我通过重载的 operator= 将一个对象分配给另一个对象。我知道问题出在哪里,但我不知道如何解决。有什么帮助吗?
class MyString{
public:
MyString( const MyString *strIni );
MyString( const char *str);
~MyString();
MyString& operator=( const MyString &str );
private:
char *str;
}
MyString::MyString( const MyString *strIni ){
this->str = new char[strlen(strIni->str)+1];
strcpy(this->str,strIni->str) ;
};
MyString::MyString( const char *str){
this->str = new char[ strlen(str) + 1 ];
strcpy(this->str , str);
};
MyString::~MyString(){
delete [] this->str ;
cout << "successfully deleted..." << endl;
};
MyString& MyString::operator=( const MyString &str ){
// temp obj holding the rhs
MyString strTmp(str);
// temp char pointer holding the rhs
char *cTmp = strTmp.str;
// temp obj holding this, later release this memory
strTmp.str = this->str ;
// this holding rhs; assignment done.
this->str = cTmp;
return *this ;
};
int main(){
{ // line 1
MyString mystr1("string #1"); // line 2
MyString mystr2("string #2"); // line 3
mystr1 = mystr2; // line 4
} // line 5
return 0;
}
代码的问题是:在第4行,赋值后两个对象mystr1和mystr2中的指针都指向同一个字符串“string #2”。当程序在第 5 行跳出括号时,会自动按顺序调用析构函数:mystr2 和 mystr1。mystr2 被破坏后,“string#2”的内存已经被释放。当 mystr1 的析构函数试图释放不存在的内存时,程序崩溃了。
任何人都可以帮助我修复重载成员函数。当我分配 mystr1 = mystr2 时,我可以创建一个新字符串,而不是让两个指针指向同一个字符串。
非常感谢!!
更多问题的更新......谢谢吨!
实际上,我在重载函数中使用了复制和交换。根据@Mateusz Kołodziejski 的建议,我对其进行了修改:
MyString& MyString::operator=( const MyString &rhs ){
if( this != &rhs ){
// copy using constructor
MyString strTmp(rhs) ;
// swap
char *cTmp = strTmp.str;
// strTmp will be destructed, thus the memory in this will be released
strTmp.str = this->str ;
// size of rhs
const int str_size = strlen(rhs.str);
this->str = new char[str_size+1];
copy(rhs.str,rhs.str+str_size,this->str);
}
return *this ;
};
当调用析构函数时,不会崩溃。但是如果添加了打印输出成员函数,似乎又出现了一个问题:
void MyString::printout(){
int str_size = strlen(this->str);
cout << "string size: " << str_size << endl ;
for( int i=0;i<str_size;i++ ){
cout << *(this->str + i);
}
}
在主要功能中:
int main(){
{
MyString mystr1("string #1");
MyString mystr2("string #2");
mystr1.printout();
mystr2.printout();
mystr1 = mystr2;
cout << "after assignment: " << endl;
mystr1.printout();
mystr2.printout();
}
return 0;
}
结果是:
string #1
string #2
after assignment...
string #2═²²²²
string #2
好像mystr1不正常……
有人可以为我解释一下吗?
感谢吨!