С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 19.09.2020
Сообщений: 71

Ошибка free(): double free detected in tcache 2

06.12.2021, 14:15. Показов 3727. Ответов 1
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Столкнулся с проблемой, при запуске программы появляется строка "free(): double free detected in tcache 2". Скажите, пожалуйста, в чем проблема, и как это исправить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <iostream>
#include <locale>
#include <cmath>
#include <cassert>//оператор проверочного утверждения
using namespace std;
enum class Color // Класс перечисления для будущего цвета графика
{
    red = 0, 
    green,    
    blue,        
};  
//------------------------------------------------------------------------------
class Rhombus 
{
    private:
        static int AmountOfRhombus;  //статическая переменная для хранения количества ромбов
        const int m_number;//пременная, которая содержит номер ромба.номер присваивается 1 раз и не изменяется
        static int lastRhombusNumber; // статическая переменная для хранения последнего номера, что бы каждый следующий имел номер на едицинцубольше
        double side;  // строна
        int angle_1; // меньший угол
        double diagonal_1;//диагональ1
        Color m_color;//цвет 
        const string m_name;//имя ромба
        int* m_linksToRhombus;////указатель, в котором будет храниться адрес динамического массива ссылок, где упоминается этот ромб
        int m_linksAmount;//количество ромбов
//------------------------------------------------------------------------------
    public: // геттеры
        Color getColor() const {return m_color;}//геттер для цвета
        double getside() {return side;}  // геттер для стороны
        int getangle_1() {return angle_1;} // геттер для угла 
        double getdiagonal_1() {return diagonal_1;}//геттер для диагонали
        int getLink (int index) const {return m_linksToRhombus[index];}// возвращает по индексу страницу упомнинания
        //возвращает количество уравнений
        static int getTheAmountOfRhombus () {return AmountOfRhombus;}//возвращает количество ромбов
//------------------------------------------------------------------------------------------------------------
        //сеттеры
        void setside(int a) 
        {
            assert(a!=0);
            side = a; 
        }
        
        void setangle_1 (int b)
        {
            assert(b<180);
            angle_1 = b;
        }
        void setLinkValue(int index, int value)
        {
            assert((index >= 0) && (index < m_linksAmount));  //проверка индекса 
            m_linksToRhombus [index] = value; //присваиваем значение конкретной страницы(ссылки) элементу массива страниц (ссылок) с конкретным индексом 
        }
//-------------------------------------------------------------------------------
 
    void printInfo (bool showLink= true)  const {  // показываем
            string color;
        if (m_color == Color::red) color = " красного ";
        else if (m_color == Color::green) color = " зеленого ";
        else color = " синего ";
        cout<<"Перед вами "<< m_name<<" № "<<m_number <<  color <<" цвета "<<"со стороной :  "<<side<<" см "<<", а также "<<"углами: первый и второй: "<<angle_1<<"°, остальные: "<<180-angle_1<<"°, диагоналями :  "<<side*(sqrt(2+(2*cos(angle_1 * 3.14159 / 180))))<<" см и "<<side*(sqrt(2+(2*cos((180 - angle_1) * 3.14159 / 180))))<<" см "<< endl;
            if (showLink)
            {
                std::cout << "Число упоминаний ромбов: " << m_linksAmount << endl;
                for (int i = 0; i < m_linksAmount; i++)
                {
                   cout << "[" << i << "]: " << m_linksToRhombus[i] <<endl;
                }
            }
            cout << "Общее число ромбов: " << getTheAmountOfRhombus()<< "." << endl;
            cout << "-------------------------------------" << endl;
        }    
 
//-------------------------------------------------------------------------------------------------------------
    Rhombus addRhombus(const Rhombus& RhombusToAdd) //Сложение ромбов - здесь аргумент RhombusToAdd должен быть константным,иначе константные экземпляры класса нельязя будет прибавлять
    {
        int newside = side + RhombusToAdd.side;// работает на уровне класса, а не на уровне его экземпляров
        double newangle_1 = angle_1; 
        
        if (angle_1==RhombusToAdd.angle_1)
        {
            angle_1 = newangle_1;
            side = newside;
 
            std::cout << "Ромб \"Ромб" << m_number << "\" был изменен." << std::endl;
           
        }
        else
        {
            std::cout << "Ошибка при попытке изменения ромбов \"Ромб" << m_number << "\"." << std::endl;
        } 
 
        std::cout << "-------------------------------------" << std::endl;
        return *this; // возвращаем то, что хранится по собственному адресу (ссылку на обновленного "себя")
    }
//-------------------------------------------------------------------------------------------------------       
        Rhombus(double side = 0 ,double angle_1 = 0,Color color = Color::red, int linksAmount = 10) : m_color(color), m_name(" ромб "),m_linksAmount(linksAmount), m_number(++lastRhombusNumber){// констуктор
        setside(side);
        setangle_1(angle_1);
        assert((linksAmount >= 0) && (linksAmount < 1000));  //вызываем функцию сравнения аргумента с 0
        m_linksToRhombus = new int[linksAmount] {};//динамически выделяем память под массив ссылок, обнуляем его элементы
 
        AmountOfRhombus++;// увеличиваем значение переменной на 1 (количество уравнений выросло на 1)
 
        std::cout << "Создан новый ромб." << std::endl;
        std::cout << "-------------------------------------" << std::endl;
    }
//-------------------------------------------------------------------------------------------------------------
 ~Rhombus()
    {
        AmountOfRhombus--;
 
        delete[] m_linksToRhombus;
 
        std::cout << "Удален ромбов \"Ромб" << m_number  << "\"." << std::endl;
        std::cout << "Общее число ромбов: " << getTheAmountOfRhombus() << "." << std::endl;
        std::cout << "-------------------------------------" << std::endl;
    }
};
//------------------------------------------------------------------------------------------------------------
int Rhombus:: AmountOfRhombus = 0; // Присваиваем начальные значения статическим переменным класса вне функций (по аналогии с обычными глобальными) 
int Rhombus:: lastRhombusNumber=0;
//------------------------------------------------------------------------------------------------------------
int main()
{
    setlocale(LC_ALL, "Russian");
    const Rhombus r1 { 15,60, Color::green };
    r1.printInfo(true);
    
    Rhombus r2 { 10,120, Color::red };
    r2.printInfo(false);
 
    r1.~Rhombus();;
    
    Rhombus r3{ 2, 90, Color::blue, 4 };
    r3.printInfo(false);
 
    Rhombus r4{ 8, 120, Color::green, 2 };
    r4.printInfo(false);
    
    const Rhombus r5{ 12, 45, Color::green, 2 };
    r5.printInfo(false);
 
    r2.addRhombus(r4);
    r2.printInfo(false);
 
    r3.addRhombus(r2);
    r3.printInfo(false);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2021, 14:15
Ответы с готовыми решениями:

free(): double free detected in tcache 2
После запуска скомпилированной программы вылетает это: q z free(): double free detected in tcache 2 Aborted (core dumped) ...

Ошибка: double free or corruption (fasttop)
Я описываю метод diamond-square. Это метод для процедурной генерации мира (кому интересно - вот описание) Но столкнулся с проблемой. При...

Ошибка этапа исполнения: double free or corruption (fasttop):
Доброе времени суток подскажите пожалуйста в чем может быть следующая проблема. Код который выводит программа приведен ниже. Сама...

1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.12.2021, 14:23
Цитата Сообщение от qwert10 Посмотреть сообщение
r1.~Rhombus();;
Во-первых кто вас научил вручную деструктор вызывать?

Во-вторых см. здесь: Распространенные ошибки

Проявляется здесь:
Цитата Сообщение от qwert10 Посмотреть сообщение
Rhombus addRhombus(const Rhombus& RhombusToAdd)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2021, 14:23
Помогаю со студенческими работами здесь

Ошибка "double free or corruption" в динамическом двумерном массиве
Доброго времени. Не могу понять, почему выскакивает эта ошибка: *** Error in `./a.out': double free or corruption (out):...

Double free or corruption (out)
std::stringstream brf; brf &lt;&lt; a.rdbuf(); char *tmp = new char(brf.length()); memcpy(tmp,...

double free or corruption (out)
На вход программы даётся логическая функция, записанная в форме КНФ. Требуется, используя принцип резолюций проверить тождественность...

Double free or corruption при изменении размера динамического массива
Сразу скажу, что у меня задание на работу с памятью, и std::vector по условию использовать запрещено. #include &lt;iostream&gt; ...

Double free or corruption
Здравствуйте, вылетает такая ошибка Версия DEBUG, но всё-равно почему-то не пишет названий функций, как можно узнать где идёт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru