Problem z pamięcia/stosem

0

Cześć, piszę pewien program, w którym potrzebuję dynamicznej dwuwymiarowej tablicy znaków.
Kod kompiluje się nawet bez żadnego warninga, częsciowo działa jednak po wykonaniu częsci pojawia się "program przestał działać".
Podczas debugowania pojawia się:

Zgłoszono wyjątek w lokalizacji 0x775231F6 (ntdll.dll) w Projekt.exe: 0xC0000005: Naruszenie zasad dostępu podczas odczytywania w lokalizacji 0xDDDDDDDD.

Nieobsłużony wyjątek w lokalizacji 0x775231F6 (ntdll.dll) w Projekt.exe: 0xC0000005: Naruszenie zasad dostępu podczas odczytywania w lokalizacji 0xDDDDDDDD.

Do kodu dodaję na początek deklaracje zmiennych, które są w pliku nagłówkowym:

#include "Table.hpp"
#include <iostream>

	 //int n;
	//char** board = new char*[n];

	int Table::getN() {
		return this->n;
	}
	void Table::setN(int n) {
		this->n = n;
	}
	char** Table::getBoard() {
		return this->board;
	}
	void Table::setBoard(char** board) {
		this->board = board;
	}
	void Table::createBoard(int n) {
		for (int i = 0; i < n; i++)
			this->board[i] = new char[n];
	}
	void Table::changeSize(int k) {
		char** temp = new char*[k];
		for (int i = 0; i < k; i++)
			temp[i] = new char[k];
		for (int i = 0; i < this->n; i++)
			for (int j = 0; j < this->n; j++)
				temp[i][j] = this->board[i][j];
		delete[] this->board;
		this->board = temp;
		this->n = k;
		//delete[] temp;
	}
	void Table::fillCells() {
		int k = this->n;
		for (int i = 0; i < k; i++)
			for (int j = 0; j < k; j++)
				this->board[i][j] = 'x';
	}
	void Table::printBoard() {
		int k = this->n;
		for (int i = 0; i < k; i++) {
			for (int j = 0; j < k; j++)
				std::cout << this->board[i][j];
			std::cout << "\n";
		}
		
	}
	void Table::destroyBoard() {
		delete[] this->board;
	
	}
	Table::Table(int n) {
		this->n = n;
		for (int i = 0; i < n; i++)
			this->board[i] = new char[n];
	}
int main() {
	Table table(7);
	//table.createBoard(7);
	table.fillCells();
	table.printBoard();
	//table.destroyBoard();
	//table.changeSize(9);
	//table.setN(9);
	//table.fillCells();
	//table.printBoard();
	
	return 0;

Jak widać metoda changeSize jest zakomentowana, więc to nie ona krzaczy ;/
Przy próbie uruchomienia jako administrator pojawia się:

title

Potrafi ktoś pomóc? Z góry dzięki :) Pozdrawiam

1
    Table::Table(int n) {
        this->n = n;
        for (int i = 0; i < n; i++)
            this->board[i] = new char[n];
    }

Nigdzie nie alokujesz pamięci dla board. Takie rzeczy możesz wykryć przechodząc krok po kroku z debuggerem i patrząc na wartości zmiennych :​)

Ale zamiast męczyć się z new/delete, użyj std::vector (1). Ponadto polecam użycie jednowymiarowej tablicy dla danych i 2-wymiarowego widoku na nią (2):

template<typename T>
class simple_2d_matrix_view
{
	T* data_;
	size_t width_;
	size_t height_;
 
public:
 
	simple_2d_matrix_view(T* ptr, size_t h, size_t w):
		data_{ptr},
		width_{w},
		height_{h}
	{}
 
	size_t width() const { return width_; }
	size_t height() const { return height_; }
 
	T& operator()(size_t h, size_t w) {
		assert(w < width_);
		assert(h < height_);
		return data_[width_ * h + w];
	}
 
	T const& operator()(size_t h, size_t w) const {
		return const_cast<simple_2d_matrix_view&>(*this)(h, w);
	}
};

użycie:

vector<double> data{1,2,3,4,5,6,7,8,9,10,11,12};
 
simple_2d_matrix_view<double> m(data.data(), 2, 6);
 
for(size_t i = 0; i < m.height(); ++i) {
	for(size_t j = 0; j < m.width(); ++j) {
		cout << m(i, j) << " ";
	}
	cout << "\n";
}
0

@kq: dzięki za odpowiedź, mógłbyś podpowiedzieć jak zaalokować tą pamięć? Spędziłem już dziś trochę godzin nad kodem i za późno na kolejną kawę ;/

1
    Table::Table(int n) {
        this->n = n;
        // tutaj
        this->board = new char*[n];        
        for (int i = 0; i < n; i++)
            this->board[i] = new char[n];
    }

Przy czym naprawdę odradzam używanie new jako pierwszego narzędzia.

0

Działa, dzięki wielkie za pomoc :)

1

Dawno nie widziałem podwójnych wskaźników w C++.
Stosuj raczej domyślnie std::vector, dopiero jak Ci z jakichś przyczyn nie będzie pasował (i będziesz to umiał uzasadnić) to robisz inne struktury.

0

@vpiotr: traktuję to jako małe wyzwanie, nie zamierzam się wiązać dłużej z Cpp :) ale przedmiot trzeba zaliczyć :)

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