Задать вопрос
@newmersedez

Почему при вызове конструктора выдает segmentation fault?

Здравствуйте, возникла такая проблема. Есть конструктор по умолчанию Square_matrix(), в нем создается дефолтная матрица 1x1. Есть конструктор Square_matrix(unsigned int size), в котором я создаю матрицу размером size x size. Так вот, если передается size == 1, я вызываю конструктор по умолчанию. Однако это вызывает seg fault, и я не могу понять, почему.

main.cpp:
#include <iostream>
#include "square_matrix.h"
using namespace std;

int main(void)
{
    Square_matrix   matrix1;
    Square_matrix   matrix2(1);

    cout << "matrix1: " << endl;
    matrix1.fill_matrix();
    cout << "filled matrix1" << endl;
    matrix1.print_matrix();
    cout << "printed matrix1" << endl;
    
    cout << "\nmatrix2: " << endl;
    matrix2.fill_matrix();
    cout << "filled matrix2" << endl;
    matrix2.print_matrix();
    cout << "printed matrix2" << endl;
    
    return (0);
}


square_matrix.cpp:(фрагмент с конуструкторами)
#include <iostream>
#include <time.h>
#include "square_matrix.h"

Square_matrix::Square_matrix()
{
    this->size = 1;
    try
    {
        matrix = new double *[size];
        matrix[0] = new double[size];
    }
    catch(const std::bad_alloc& ex)
    {
        std::cerr << ex.what() << '\n';
    }
}

Square_matrix::Square_matrix(unsigned int size)
{
    if (size < 1)
        std::cerr << "Invalid matrix size" << '\n';
    else if (size == 1)
    {
        this->size = 1;
        Square_matrix();
    }
    else
    {
        this->size = size;
        try
        {
            matrix = new double *[size];
            for (unsigned int i = 0; i < size; i++)
                matrix[i] = new double [size];
        }
        catch(const std::bad_alloc& ex)
        {
            std::cerr << ex.what() << '\n';
        }
    }
}

void        Square_matrix::fill_matrix()
{
    srand(time(NULL));
    for(int i = 0; i < size; i++)
        for(int j = 0; j < size; j++)
            matrix[i][j] = rand() % 10;
}

void        Square_matrix::print_matrix()
{
    for(unsigned int i = 0; i < size; i++)
    {
        for(unsigned int j = 0; j < size; j++)
        {
            std::cout << matrix[i][j] << " ";
        }
    std::cout << '\n';
    }
}


P.S.: Я знаю, что в функциях fill_matrix и print_matrix нет никаких проверок и прочего, я написал их для тестирования создания матрицы и ее заполнения, проблема не в них.
  • Вопрос задан
  • 119 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Square_matrix::Square_matrix(unsigned int size)
{
    if (size < 1)
        std::cerr << "Invalid matrix size" << '\n';
    else if (size == 1)
    {
        this->size = 1;
        Square_matrix();
    }

если передается size == 1, я вызываю конструктор по умолчанию

Square_matrix(); -- это не вызов конструктора по умолчанию для текущего объекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы