Происходит утечка памяти в 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 шт):

Автор решения: Harry

Вы, конечно, не привели весь код, нет описания класса и т.д. — но ошибка типичная: вы попросту сделали/повторили конструктор копирования, перед этим не освободив уже выделенную для объекта память.

Проще (и глобальнее) всего — если у вас есть корректно написанный конструктор копирования, добавить к классу функцию обмена полей, что-то типа

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, но тогда вы рядом дублируете код конструктора копирования, и нужна обязательная проверка, не присваиваете ли вы объект самому себе.

→ Ссылка
Автор решения: DmitryK

@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;

→ Ссылка