Еще раз про перегрузку операторов для своего класса строк

225
29 июня 2017, 03:48

Задача написать свой класс "Строка". Столкнулся с такой проблемой: во время выполнения программы ошибка "Expression:CrtlsValidHeapPointer(block)".

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

#include <cstring>
#include <iostream>
class my_string
{
private:
    int length;
    char *symbols;
public:
    my_string()
    {
        length = 0;
        symbols = new char[100];
    }
    ~my_string()
    {
        delete symbols;
    }
    my_string(const my_string& s)
    {
        length = s.length;
        symbols = new char(*s.symbols);
    }
    my_string my_string::operator=(const my_string& s)
    {
        length = s.length;
        symbols = new char(*s.symbols);
        return *this;
    }
    my_string my_string::operator+=(const my_string& s)
    {
        my_string tmp;
        delete tmp.symbols;
        length = strlen(symbols) + strlen(s.symbols);
        tmp.symbols = new char[length + 1];
        strcpy(tmp.symbols, symbols);
        strcat(tmp.symbols, s.symbols);
        delete symbols;
        symbols = new char[length + 1];
        strcpy(symbols, tmp.symbols);
        delete tmp.symbols;
        return *this;
    }
    bool my_string::operator==(const my_string& s)
    {
        if (strcmp(symbols, s.symbols))
            return false;
        else return true;
    }
    my_string clean_string()
    {
        delete symbols;
        my_string();
        return *this;
    }
};

Данные в symbols ввожу с помощью std::cin>>symbols, но убрал, чтобы не захламлять код

Answer 1
  1. Все случаи, когда делается

    symbols = new char(*s.symbols);
    

    это какая-то бессмыслица. Это выделение памяти для одного символа строки и копирование одного символа. Разумеется, одного символа совершенно недостаточно для хранения строки ненулевой длины.

    При этом в реализации оператора += такой бессмыслицы не наблюдается - там память выделяется более-менее правильно. Почему наблюдается такая разница?

  2. Освобождение памяти, выделенной через new[], делается через delete[], а не через delete.

  3. В операторе += тем не менее написана масса ерунды. Например, в конце делается delete tmp.symbols;, после чего будет автоматически вызван деструктор tmp, который снова сделает delete tmp.symbols;. Все накроется.

  4. Оператор присваивания должен освобождать старое содержимое объекта, а затем копировать в него новое. Я не вижу у вас освобождения старого содержимого. У вас вообще оператор присваивания совпадает с конструктором копирования, что бессмысленно.

  5. Что вы хотели сказать вот этим

    my_string();
    

    внутри clean_string? И зачем clean_string возвращает какую-то строку по значению?

  6. Еще масса мелких странностей и ошибок.

READ ALSO
Qt C++ Заголовки таблицы

Qt C++ Заголовки таблицы

Привет всемЕсть TableWidget и есть QStringList c элементами

354
Почему i[array] подобен array[i]? [дубликат]

Почему i[array] подобен array[i]? [дубликат]

На данный вопрос уже ответили:

241
shared_ptr ошибка при линковке c++

shared_ptr ошибка при линковке c++

pastebincom - исходный код заголовочного файла с реализацией shared_ptr

218
Ограничение выбора в календарной форме

Ограничение выбора в календарной форме

Можно ли в календарной форме datepicker ограничить возможность выбора только определенным днем недели? Средствами из коробки, так сказатьВ документации...

335