Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Naruszenie ochrony pamięci w klasie

Ostatnio zmodyfikowano 2016-10-20 23:38
Autor Wiadomość
mateczek
» 2016-10-18 09:04:44
C/C++
#define botleft 200
#define botright 188
#define horizontal 205
#define vertical 185
#include <string>
class board {
    int width;
    int height;
    char ** tab; //skoro pani Monika mówi, że nie wolno w konwencji tablicowej to trzeba zmienić deklaracje
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 ) {
    // delete[] tab[ height ]; //tutaj próbujesz skasować coś czego jeszcze nie było Debuger sobie odpal
    if( a )
         width = a;
   
    if( b )
         height = b;
   
    tab = new char *[ width ]; //skoro tablica 2D to najpierw alokujesz pamięć na tab a potem na poszczególne wiersze                 
    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++ ) // wyjście poza zakres dlaczego znak = grubo coś nie tak !!!
         tab[ i ][ j ] = ' ';
   
    for( int i = 0; i < width; i++ ) {
        tab[ i ][ 0 ] = horizontal;
        tab[ i ][ height ] = horizontal; // wyjście poza zakres !!!
    }
}

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();
}
P-152626
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?
P-152629
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
P-152630
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
P-152671
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.
P-152688
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 :
C/C++
void board::setdims( short a, short b ) {
    if( tab ) { //sprawdzenie czy wskaćnik null
        for( int i = 0; i < width; i++ ) { //prawidłowe zwolnienie pamięci
            delete[] tab[ i ];
        }
        delete[] tab;
    }
    if( a )
         width = a;
   
    if( b )
         height = b;
   
    tab = new char *[ width ]; //skoro tablica 2D to najpierw alokujesz pamięć na tab a potem na poszczególne wiersze
    for( int i = 0; i < width; i++ ) {
        tab[ i ] = new char[ height ];
    }
}
Zastanów się poważnie nad kontenerami zamiast luźnych tablic !!!
P-152705
1 « 2 »
Poprzednia strona Strona 2 z 2