Я не знаю, почему происходит повреждение кучи (о проблеме выделения памяти) - PullRequest
0 голосов
/ 28 мая 2019

это курс одного из проектов, и его цель - создать полноценный класс 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.

1 Ответ

1 голос
/ 28 мая 2019

Вы забыли написать this->str_ = temp; в любом месте.Вы просто пытаетесь записать более длинную строку в более короткое пространство.

strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;

Должно быть

delete [] this->str_;
this->str_ = temp;
...