Задача написать свой класс "Строка". Столкнулся с такой проблемой: во время выполнения программы ошибка "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, но убрал, чтобы не захламлять код
Все случаи, когда делается
symbols = new char(*s.symbols);
это какая-то бессмыслица. Это выделение памяти для одного символа строки и копирование одного символа. Разумеется, одного символа совершенно недостаточно для хранения строки ненулевой длины.
При этом в реализации оператора += такой бессмыслицы не наблюдается - там память выделяется более-менее правильно. Почему наблюдается такая разница?
Освобождение памяти, выделенной через new[], делается через delete[], а не через delete.
В операторе += тем не менее написана масса ерунды. Например, в конце делается delete tmp.symbols;, после чего будет автоматически вызван деструктор tmp, который снова сделает delete tmp.symbols;. Все накроется.
Оператор присваивания должен освобождать старое содержимое объекта, а затем копировать в него новое. Я не вижу у вас освобождения старого содержимого. У вас вообще оператор присваивания совпадает с конструктором копирования, что бессмысленно.
Что вы хотели сказать вот этим
my_string();
внутри clean_string? И зачем clean_string возвращает какую-то строку по значению?
Еще масса мелких странностей и ошибок.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники