Происходит утечка памяти в operator=
BaseString& operator=(BaseString& s)
{
len = s.len;
p = new char[s.capacity];
capacity = s.capacity;
for (int i = 0; s.p[i] != '\0'; i++)
p[i] = s.p[i];
p[len] = '\0';
return *this;
}
Ответы (2 шт):
Вы, конечно, не привели весь код, нет описания класса и т.д. — но ошибка типичная: вы попросту сделали/повторили конструктор копирования, перед этим не освободив уже выделенную для объекта память.
Проще (и глобальнее) всего — если у вас есть корректно написанный конструктор копирования, добавить к классу функцию обмена полей, что-то типа
void BaseString::swap(BaseString&s)
{
std::swap(len,s.len);
std::swap(p,s.p);
std::swap(capacity,s.capacity);
}
Тогда присваивание легко записать как
BaseString& operator = (const BaseString& s)
{
BaseString tmp(s);
swap(tmp);
return *this;
}
или даже
BaseString& operator = (BaseString s)
{
swap(s);
return *this;
}
И обратите внимание на const в первом варианте; не забывайте его писать, его отсутствие рано или поздно аукнется...
P.S. Конечно, можно просто добавить строчку освобождения памяти delete[]p, но тогда вы рядом дублируете код конструктора копирования, и нужна обязательная проверка, не присваиваете ли вы объект самому себе.
@Harry написал правильно. Если проще - оператор присваивания используется не только с новым объектом, в которм память под буфер не выделена. Если в Вашем объекте уже выделена через new память под буфер, то в вашей версии она как раз и утекает. Вы её не освободили, а просто указателю присвоили адрес нового выделенного куска памяти.
BaseString& operator=(BaseString& s)
{ // вот здесь - а если p указывал на уже выделенную память? То она утекает.
p = new char[s.capacity];
}
Должно быть как-то так:
BaseString& operator=(BaseString& s)
{
if( p != nullptr )
delete[] p;
p = nullptr; // на случай если new в след. строке выкинет исключение
p = new char[s.capacity];
}
И в конструкторе если сразу память не выделяется, то не забыть иницииализировать указатель p = nullptr;