Функция стирания строк, вызывающая повреждение кучи

Здравствуйте, я работаю над своим строковым классом, и я хотел добавить функцию стирания. Итак, я решил, что использую стратегию копирования памяти до начального индекса, а затем копирую память после длины + начального индекса. Это просто скопирует данные за пределы той части, которую вы хотите удалить.

Вот мой код прямо сейчас.

//size is the current size of the string not including the null terminator character
//data is the character array of data

    void erase(const size_t start, const size_t length) {
            if (start + length <= size) {
                size_t tempsize = start + length;
                char* temp = new char[size + 1 - length];
                
                //copy before start
                if(start > 0)
                    memcpy(temp, data, start);

                //copy after start (including null terminator character)
                memcpy(temp + start, data + start + length, size + 1 - length - start);

                delete[] data;

                data = temp;
                data[size] = '\0';
                size = tempsize;
            }
    }

Он отлично работает, избавляясь от количества символов, которое вы хотите, но выдает ошибку повреждения кучи, когда я удаляю строку.


person Salmoncatt    schedule 08.02.2021    source источник
comment
Не забывайте всегда отмечать свой вопрос языком, который вы используете -- c++ в этом случае. Тег языка является наиболее важным тегом, который следует использовать при задании вопросов; без него вопрос найти сложнее (для тех, кто отвечает, и для будущих зрителей).   -  person costaparas    schedule 15.02.2021
comment
@costaparas хорошо, спасибо   -  person Salmoncatt    schedule 16.02.2021


Ответы (1)


Я не знаю почему, но он перестал выдавать исключение, вот текущий код, если хотите.

void erase(const size_t& start, size_t length) {
            if (start >= size) {
                return;
            }

            if (start + length > size) {
                length = size - start;
            }

            char* temp = new char[size + 1 - length];

            //copy before start
            if (start > 0)
                memcpy(temp, data, start);

            //copy after start (including null terminator character)
            memcpy(temp + start, data + start + length, size + 1 - length - start);

            delete[] data;

            data = temp;
            size = size - length;

        }
person Salmoncatt    schedule 08.02.2021