Странное поведение с деструктором

0

Я не знаю, как это исправить, ниже - действительно простой класс, который хранит 2D-динамический массив и размер в объекте (матрице). Моя проблема заключается в том, что инициализация нескольких из этих классов не работает, ЕСЛИ я вызываю функцию-член. Я сузил проблему, и это деструктор, который вызывает это.

Square_Matrix a;   //works
Square_Matrix b;

,

Square_Matrix a,b; //works
a.Set_Size(5);

,

Square_Matrix a,b; //doesn't work as a lone statement, the above does though

файл заголовка:

#include <iostream>
using namespace std;

class Square_Matrix
{
public:
   int **matrix;
   int size;
   Square_Matrix();
   ~Square_Matrix();   //causing the problem
   void Set_Size (int new_size);
}

.cpp файл:

#include <iostream>
using namespace std;
#include "Square_Matrix.h"


Square_Matrix::Square_Matrix()
{
    size = 0;
}

Square_Matrix::~Square_Matrix()  //causing the problem
{
    for (int i = 0; i < size; i++){
        delete [] matrix[i];
    }
    delete [] matrix;
}
  • 0
    Также, даже если я добавлю оператор if (если размер> 0), у него все еще будет та же проблема.
  • 0
    Вы не описали, в чем проблема . Вы говорите, что «инициализация класса не работает». Что это обозначает? Что происходит, когда вы пытаетесь это сделать?
Теги:
destructor

1 ответ

2
Лучший ответ

Конструктор по умолчанию не инициализирует матрицу элементов данных. Таким образом, ваша программа имеет неопределенное поведение.

Вы можете определить деструктор и конструктор следующим образом

Square_Matrix::Square_Matrix()
{
    size = 0;
    matrix = nullptr;
}

Или

Square_Matrix::Square_Matrix() : matrix( nullptr ), size( 0 )
{
}

Square_Matrix::~Square_Matrix()  //causing the problem
{
    if ( matrix )
    {
        for (int i = 0; i < size; i++){
            delete [] matrix[i];
        }
        delete [] matrix;
    }
}

Также учтите, что вам нужно либо определить конструктор копирования, либо оператор присваивания копии, либо подавить копирование и назначение объектов вашего класса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню