destruktor macierzy - działa na zmiennej wskaźnikowej, na normalnej nie.

0

Witam.

Postanowiłem sobie przypomnieć co pamiętam z C++. Wybór padł na zrobienie macierzy. Nie będę rozpisywał się prozą wkleję kod:

Plik Matrix.h

 #pragma once

class Matrix
{
	private:
		int m_rows;
		int m_cols;
		double **m_value;

	public:
		Matrix(int, int);
		~Matrix();
};

Matrix::Matrix(int rows, int cols)
{
	m_rows = rows;
	m_cols = cols;

	m_value = new double*[m_rows];
	for (int r = 0; r < rows; r++)
	{
		m_value[r] = new double[cols];
	}

	for (int r = 0; r < m_rows; r++)
	{
		for (int c = 0; c < m_cols; c++)
		{
			m_value[r][c] = 1.0;
		}
	}
}

Matrix::~Matrix()
{
	for (int r = 0; r < m_rows; r++)
	{
		delete[] m_value[r];
	}
	delete m_value;

	m_rows = 0;
	m_cols = 0;
}

Plik main.cpp

 #include <iostream>
#include <cstdlib>
#include "Matrix.h"


int main()
{
	//Version a
	//Matrix a = Matrix(2, 3);
	//a.~Matrix();
	//Version b
	//Matrix *b = new Matrix(2, 1);
	//b->~Matrix();

	system("pause");
	return 0;
}

O ile kod w wersji b (wskaźnik) działa bez zarzutu, to gdy zostawię tylko wersję a, program wykrzacza mi się chyba na destruktorze, bo jak wyrzucę linijkę

 a.~Matrix();

program się nie wykrzacza. Co może być przyczyną takiej sytuacji?

1

Paniekolego.

Po pierwsze cin.get() lub getchar() a nie system( "pause" );
jak już musi być.

Po dwa.

te linijki ... z destruktora. Po co ustawiać coś na zero jezeli i tak cały element zaraz przestanie istnieć.
m_rows = 0;
m_cols = 0;

delete m_value;

tutaj też masz tablicę więc delete []

1
  1. W destruktorze detele[] m_value
  2. Po co wołasz destruktor? Destruktor jest wołany automatycznie w odpowiednich momentach i poza szczególnymi przypadkami nie ma sensu go wołać ręcznie.
  3. delete b a nie b->~Matrix()
1
class Matrix
{
  private:
    unsigned rows, cols;
    std::vector< double > data;
  
  public:
    Matrix( unsigned rows, unsigned cols ) : rows( rows ), cols( cols )
    {
      data.resize( rows * cols );
    }
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1