@arkadiy_ksvu
учусь на физтехе

Почему возникает free(): double free detected in tcache 2? (в деструкторе)?

#include <cstddef> // size_t
#include <cstring> // strlen, strcpy
#include <stdio.h>

struct String {

    size_t size;
	char *str;

    
    /* Реализуйте этот конструктор */
	String(size_t n, char c)
    {

        this->str = new char[n + 1];
        
        for (int i = 0; i < n; i++)
        {

            this->str[i] = c;

        }

        this->str[n] = '\0';

        size = n;

    }

    
    /* Реализуйте этот конструктор */
	String(const char *str = "")
    {
        size = strlen(str);
        this->str = new char[size + 1];
        strcpy(this->str, str);

    }

    
    ~String()
    {

        printf("dtr p = %p s = %s\n", str, str);
        delete[] str;

    }


    void append(String s)
    {

        char* tmp = new char[size + s.size + 1];

        strcpy(tmp, str);

        strcpy(tmp + size, s.str);

        size += s.size;

        printf("app %p\n", str);
        //delete [] str;
        str = tmp;

    }
    
};



int main()
{

    char cs[20] = "fjsklds";

    String s1(cs);

    printf("%s\n", s1.str);


    String s2(10, 'r');

    printf("%s\n",s2.str);

    s2.append(s1);

    printf("%s\n", s2.str);


}
  • Вопрос задан
  • 2036 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему возникает free(): double free detected

Потому что в этом классе не реализован конструктор копирования (а так же перемещения и операторы присваивания, но это пока не вызывает таких же ошибок). В результате при копировании объекта класса String копия получает то же значение str что и оригинал с которого она скопирована, в деструкторе копия удаляет str оригинала, а потом это же делает оригинал в своём деструкторе. См. правило трёх/пяти.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы