Я не знаю, как это исправить, ниже - действительно простой класс, который хранит 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;
}
Конструктор по умолчанию не инициализирует матрицу элементов данных. Таким образом, ваша программа имеет неопределенное поведение.
Вы можете определить деструктор и конструктор следующим образом
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;
}
}
Также учтите, что вам нужно либо определить конструктор копирования, либо оператор присваивания копии, либо подавить копирование и назначение объектов вашего класса.