Szustarol Temat założony przez niniejszego użytkownika |
Naruszenie ochrony pamięci w klasie » 2016-10-17 17:24:29 Witam! postanowiłem, że nauczę się tego programowania obiektowego (w końcu), mam coś takiego main.cpp #include <iostream> #include <string> #include "board.hpp" using namespace std; int main() { board mainwindow; mainwindow.basics(); mainwindow.setdims( 79, 24 ); cout << mainwindow.returntab(); }
board.hpp #ifndef board_hpp #define board_hpp #include <string> class board { int width; int height; char * tab[]; public: void setdims( short a, short b ); short getwidth(); short getheight(); void init(); void basics(); std::string returntab(); }; #endif
board.cpp #include "board.hpp" #define topleft 201 #define topright 187 #define botleft 200 #define botright 188 #define horizontal 205 #define vertical 185 #include <string>
void board::basics() { width = 79; height = 29; setdims( 79, 24 ); }
void board::setdims( short a, short b ) { delete[] tab[ height ]; if( a ) width = a; if( b ) height = b; * tab = new char[ width ]; for( int i = 0; i < height; i++ ) { tab[ i ] = new char[ height ]; } } short board::getwidth() { return width; } short board::getheight() { return height; }
void board::init() { for( int i = 0; i < width; i++ ) for( int j = 0; i = height; i++ ) tab[ i ][ j ] = ' '; for( int i = 0; i < width; i++ ) { tab[ i ][ 0 ] = horizontal; tab[ i ][ height ] = horizontal; } }
std::string board::returntab() { std::string temp; for( int i = 0; i < height; i++ ) { for( int j = 0; j < width; j++ ) { temp += tab[ i ][ j ]; } temp += "\n"; } return temp; }
no i niestety mam tu naruszenie ochrony pamięci wiem, że to w miejscu zaznaczonym w kodzie, ale nie wiem dlaczego, czy ktoś mógłby mnie nakierować? Aha, drugie pytanie zalozmy, ze chce kompatyblinosc wsteczna z c jak to wtedy zrobic, czy takie podejscie jest dobre? //header typedef struct board{ te wszystkie inty ktore mam w tej klasie
}; void setdims(struktura, a, b); shord getwidth(struktura); itd..
i kolejne pytanie, wiem ze w klasie w jakis sposob zle definiuje pamiec tablicy, jak musial bym ja alokowac gdybym uzywal struktury? wiec prosze was w sumie o dwie odpowiedzi w jednym pytaniu, ale mysle ze nie jest to spore naduzycie:) |
|
carlosmay |
» 2016-10-17 17:37:00 wiem, że to w miejscu zaznaczonym w kodzie, ale nie wiem dlaczego, czy ktoś mógłby mnie nakierować? |
Próbujesz zwolnić pamięć, która nie jest zaalokowana. PS: czemu nie skorzystasz z tablicy std::string? |
|
mateczek |
» 2016-10-17 18:04:05 |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2016-10-17 18:30:05 @carlosmay
w takim razie jak moglbym zrobic tak, aby zarowno zwalniac poprzednia tablice jak i tworzyc nowa w momencie wywolania funkcji? w przypadku wywolania X > 1 to nie jest problem ale pierwsze wywolanie zawsze bedzie odwolywac sie do tablicy jeszcze nie istniejacej w moim przypadku. Macie moze jakies pomysly? po prostu ustawic sobie boola, ma to sens?
co do 2 elementy tablicy charow sie latwiej edytuje
EDIT jak sobie usune usuwanie tej alokacji a potem wywolam setdims tylko raz, to tak czy inaczej mam naruszenie ochrony pamieci, wiec to nie jest tylko kwestia usuwania pamieci ktora nie istnieje |
|
Monika90 |
» 2016-10-17 21:16:12 W deklaracji tablicy która jest składnikiem klasy trzeba podać rozmiar.
#define topleft 201 #define topright 187 #define botleft 200 #define botright 188 #define horizontal 205 #define vertical 185
|
const int top_left = 201; const int bottom_left = 200;
I od razu jest ładniej. |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2016-10-17 21:33:31 Czyli nie możliwe jest utworzenie w klasie tablicy o rozmiarze podanym przez użytkownika? |
|
Monika90 |
» 2016-10-17 21:54:32 Kompilator musi znać rozmiar obiektów klasy.
Użyj wektora std::vector<T>, albo inteligentnego wskaźnika std::unique_ptr<T[]>, (wektor lepszy). |
|
carlosmay |
» 2016-10-17 22:57:15 Dodam do tego jeszcze std::string zamiast tablicy char* i kod stanie się prosty (wręcz trywialny). |
|
« 1 » 2 |