Naruszenie ochrony pamięci w klasie
Ostatnio zmodyfikowano 2016-10-20 23:38
mateczek |
» 2016-10-18 09:04:44 #define botleft 200 #define botright 188 #define horizontal 205 #define vertical 185 #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(); }; void board::basics() { width = 79; height = 29; setdims( 79, 24 ); }
void board::setdims( short a, short b ) { if( a ) width = a; if( b ) height = b; tab = new char *[ width ]; for( int i = 0; i < width; 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; } #include <iostream> #include <string>
using namespace std; int main() { board mainwindow; mainwindow.basics(); mainwindow.setdims( 79, 24 ); cout << mainwindow.returntab(); } |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2016-10-18 17:07:13 Moniko, chciałbym, aby ten kod był względnie łatwy do przeportowania na język C gdy zajdzie taka potrzeba, więc wolał bym unikać używania wektorów. Czy nie ma absolutnie żadnego sposobu na dynamiczną tablicę w klasie lub strukturze? |
|
mateczek |
» 2016-10-18 17:32:06 aby ten kod był względnie łatwy do przeportowania na język C |
no to raczej obiektowe odpada. A co do tablic toć Ci poprawiłem tą deklaracje i program po poprawkach się nawet wykonuje. Aczkolwiek co do działania to nie bardzo wiem co on ma robić. funkcje init() masz chyba strasznie pokopaną. Ale w wykonaniu się przedstawionego programu nie bierze udziału |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2016-10-20 11:40:57 @mateczek w sumie przepraszam, że odkopuje temat, ale czy jak wywolam sobie ta metode setdims wiele razy czy nie dojdzie do przepelniania pamieci? W koncu caly czas jest alokowana nowa tablica a nigdzie nie jest ona usuwana co do funkcji init to wiem ze jest nieprawidlowa,z tym sobie poradze |
|
karambaHZP |
» 2016-10-20 20:43:25 new alokuje miejsce na stercie, więc program długo musi kręcić, aby się wysypał. Jednak to jest możliwe. |
|
mateczek |
» 2016-10-20 23:38:30 zarządzanie pamięcią to również problem. Jednak gdy zwolnisz wcześniej nieprzydzielony wskaźnik to masz aj-waj. Możesz początkowy wskaźniku ustawić na "nullptr" dlatego funkcja mogła by wyglądać tak : void board::setdims( short a, short b ) { if( tab ) { for( int i = 0; i < width; i++ ) { delete[] tab[ i ]; } delete[] tab; } if( a ) width = a; if( b ) height = b; tab = new char *[ width ]; for( int i = 0; i < width; i++ ) { tab[ i ] = new char[ height ]; } }
Zastanów się poważnie nad kontenerami zamiast luźnych tablic !!! |
|
1 « 2 » |