Задача написать свой класс "Строка". Столкнулся с такой проблемой: во время выполнения программы ошибка "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
возвращает какую-то строку по значению?
Еще масса мелких странностей и ошибок.
pastebincom - исходный код заголовочного файла с реализацией shared_ptr
Можно ли в календарной форме datepicker ограничить возможность выбора только определенным днем недели? Средствами из коробки, так сказатьВ документации...