我正在爲自己的作業定義自己的字符串類。這涉及到我的注意,下面的代碼在C++中連接兩個自定義的字符串對象?
class MyString {
public:
MyString(const char* s = NULL) {len = strlen(s); str = new char[len + 1]; strcpy(str, s);}
~MyString() {delete [] str;}
friend ostream& operator << (ostream& ost, const MyString& s) { ost << s.str; return ost;}
friend MyString operator + (const MyString &s1, const MyString &s2) {
int length = strlen(s1.str) + strlen(s2.str);
char *str = new char[length + 1];
strcpy(str, s1.str);
strcat(str, s2.str);
return MyString(str);
}
private:
char * str;
int len;
};
int main() {
MyString s1 = MyString("hello");
MyString s2 = MyString("world");
cout << s1 + s2 << endl;
return 0;
}
作品,返回的對象是在最後時刻產生。但下面的代碼
class MyString {
public:
MyString(const char* s = NULL) {len = strlen(s); str = new char[len + 1]; strcpy(str, s);}
~MyString() {delete [] str;}
friend ostream& operator << (ostream& ost, const MyString& s) { ost << s.str; return ost;}
friend MyString operator + (const MyString &s1, const MyString &s2) {
int length = strlen(s1.str) + strlen(s2.str);
MyString temp;
temp.str = new char[length + 1];
strcpy(temp.str, s1.str);
strcat(temp.str, s2.str);
return temp;
}
private:
char * str;
int len;
};
int main() {
MyString s1 = MyString("hello");
MyString s2 = MyString("world");
cout << s1 + s2 << endl;
return 0;
}
不,給我一個運行時錯誤。所以我很困惑爲什麼第二種方法失敗,如果一個臨時對象被定義,修改並在重載操作符中返回。
我強烈推薦兩件事:(1)不要使用手動記憶管理;相反,環繞一個'std :: unique_ptr'。 (2)不要使用C字符串函數。使用C++標準庫算法代替(特別是,這將是'std :: copy'這裏。 –
'MyString temp;'使用's == nullptr'的構造函數,然後'strlen(s)'是UB。 – zch
請使用debugger – Drop