это, конечно, один из проектов, и его цель - создать полностью рабочий класс MyString. Пока не сделал метод деструктора, он работал хорошо. но в main.cpp, когда я пытался использовать этот метод, который я сделал, происходит повреждение кучи. я думал, что проблема возникает из-за порядка вызова деструктора, но я не мог понять, где это произошло.
попробуйте проверить выделенную память (обратный порядок вызова) обработка без метода деструктора (он работает)
main.cpp
void main() {
MyString a = MyString("HELLOMYNAMEIS");
char ab[10] = "thisiskrw";
MyString c = ab;
a = a + c;
cout << a;
}
MyString.cpp
MyString::~MyString() {
delete[] str_;
}
MyString operator+(const MyString& lhs, const MyString& rhs) {
MyString a(lhs);
MyString b(rhs);
a += b;
cout << a;
return a;
}
MyString& MyString::operator+=(const MyString& str) {
int i = 0;
if (this->capacity() < (this->length_ + str.length_)) {
char* temp = new char[this->length_ + str.length_+1];
memset(temp, '\0', this->length_+str.length_+1);
strcpy(temp, this->str_);
for (int i = 0; i < str.length_; i++) {
temp[(this->length_) + i] = str.str_[i];
}
temp[this->length_ + str.length_] = '\0';
strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;
}
else {
for (int i = 0; i < str.length_; i++) {
this->str_[(this->length_) + i] = str.str_[i];
}
this->length_ = this->length_ + str.length_;
}
return *this;
}
он будет печатать строку внутри объекта MyString.
Вы также можете подумать о конструкторе копирования и операторе присваивания, если у вас их нет, чтобы не удалять вещи дважды. Прочтите о правиле трех.
Вы где-то забыли написать this->str_ = temp;
. Вы просто пытаетесь записать более длинную строку в более короткое пространство.
strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;
Должно быть
delete [] this->str_;
this->str_ = temp;
Взгляните на последние три строки в
operator+=
, когда вам нужно выделить больше памяти. Подумайте, что вы только что сделали в этой функции и что должны делать эти три строки.