Двойное освобождение памяти С++

220
06 июня 2022, 20:20

Недавно начал использовать vector в С++, столкнулся с ошибкой:

free(): double free detected in tcache 2 Aborted

Программа написана в целях обучения. Если знаете как эту ошибку исправить, напишите пожалуйста по подробнее, самая главная задача - освободить x.

#inlclude <vector>
#include <iostream>
using namespace std;
class Obj{
    int *x;
    int y;
public:
    Obj(int x, int y){
        this->x = new int(x);
        this->y = y;
    }
    ~Obj(){delete x;}
    int getX(){return *x;}
    int getB(){return y;}
};
void create(int x, int y, vector <Obj> &v){
    Obj obj(x, y);
    v.push_back(obj);
}
int main(int argc, char const *argv[]){
    vector <Obj> v;
    create(10, 40, v);
    create(1032, 124, v);
    create(4, 2, v);
    for(int i = 0; i < v.size(); i++){
        cout << "X - " << v[i].getX() << endl;
        cout << "Y - " << v[i].getB() << endl << endl;
    }
    return 0;
}
Answer 1

Проблема была решена конструктором копирования, спасибо всем кто помог! :)

(Изменения помечены комментариями)

#include <vector>
#include <iostream>
using namespace std;
class Obj{
    int *x;
    int y;
public:
    //конструктор копирования
    Obj(const Obj &obj){
        x = new int(*obj.x);
        y = obj.y; 
    }
    Obj(int x, int y){
       this->x = new int(x);
       this->y = y;
    }
    ~Obj(){delete x;}
    int getX(){return *x;}
    int getB(){return y;}
};
void create(int x, int y, vector <Obj> &v){
    Obj obj(x, y);
    v.push_back(obj);
}
int main(int argc, char const *argv[]){
    vector <Obj> v;
    create(10, 40, v);
    create(1032, 124, v);
    create(4, 2, v);
    for(int i = 0; i < v.size(); i++){
        cout << "X - " << v[i].getX() << endl;
        cout << "Y - " << v[i].getB() << endl << endl;
    }
    return 0;
}
READ ALSO
Несколько окон. Qt

Несколько окон. Qt

Вообщем, не понимаю как правильно создавать второе окноЕсть функция addTimer(), как метод класса главного окна MainWindow

163
Среднее арифметическое данных массива (который элемент структуры динамического массива)

Среднее арифметическое данных массива (который элемент структуры динамического массива)

Имеется следующая проблемаЕсть функция для расчета среднего балла (индивидуальных и общего)

168
Можно ли double &quot;засунуть&quot; в bitset, чтобы он вывел его в 2виде?

Можно ли double "засунуть" в bitset, чтобы он вывел его в 2виде?

Можно ли double "засунуть" в bitset, чтобы он вывел его в 2виде?

211
Отображение переменных в QtCreator через gdb

Отображение переменных в QtCreator через gdb

Отладчик gdb не показывает содержимое переменной типа std::string

205