LINUX.ORG.RU

double free or corruption (out)

 


0

1

Есть класс Matrix, в конструкторе память динамически резервируется, в деструкторе - освобождается, но при попытке освободить память деструктор терпит фиаско с сообщением double free or corruption (out). Это происходит если cols>rows, т.е при Matrix(3, 3) исключения нет, а вот при Matrix(3, 4) есть.

struct Matrix
{
    double **a;
    unsigned rows, cols;

    Matrix(const unsigned rows, const unsigned cols):
        rows(rows),
        cols(cols)
    {
        a = new double*[rows];

        for (unsigned i = 0; i < cols; ++i) {
            a[i] = new double[cols];
        }
    }

    ~Matrix()
    {
        for (unsigned i = 0; i < rows; ++i) {
            delete []a[i]; // double free or corruption (out)
        }

        delete []a;
    }
};

int main()
{
    Matrix m(3, 4);
    return 0;
}
Пробовал использовать malloc/calloc/free - та же ошибка.

Запускаешь свою программу (желательно собранную с дебажной инфой) через valgrind --leak-check=no --track-origins=yes и смотришь, где произошло выделение памяти, первое удаление и второе.

Или (пере)собираешь с -fsanitize=address - то же самое, только без valgrind

annulen ★★★★★
()

a = new double*[rows];

for (unsigned i = 0; i < cols; ++i) {

Ты создаёшь массив из rows элементов, а итерируешься до cols. Просто повреждаешь себе кучу.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от neversleep

Я бы ещё посоветовал выпилить копирующий конструктор и копирующий оператор присваивания

Matrix(const Matrix&) = delete;
Matrix& operator=(const Matrix&) = delete;
После этих действий копирующие и перемещающие конструктор и оператор присваивания будут выпилены.

quiet_readonly ★★★★
()

может тут проблема:

    for (unsigned i = 0; i < cols; ++i) { // <- ctor new[] cols
    for (unsigned i = 0; i < rows; ++i) { // <- dtor delete[] rows

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.