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ść
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
C/C++
#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
C/C++
#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
board.cpp
C/C++
#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 ]; //gdzies tutaj mam chyba naruszenie
    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:)
P-152608
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?
P-152609
mateczek
» 2016-10-17 18:04:05
C/C++
delete[] tab[ height ]; //gdzies tutaj mam chyba naruszenie
//dla mnie to na pierwsz żut oka wygląda na przekroczenie zakresu. Ostatnim elementem tablicy o rozmiarze "height" jest element tab[ height -1];
P-152610
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
P-152611
Monika90
» 2016-10-17 21:16:12

C/C++
char * tab[];
W deklaracji tablicy która jest składnikiem klasy trzeba podać rozmiar.


C/C++
#define topleft 201
#define topright 187
#define botleft 200
#define botright 188
#define horizontal 205
#define vertical 185

C/C++
const int top_left = 201;
const int bottom_left = 200;
//etc...
I od razu jest ładniej.
P-152612
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?
P-152613
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).
P-152615
carlosmay
» 2016-10-17 22:57:15
Dodam do tego jeszcze std::string zamiast tablicy char* i kod stanie się prosty (wręcz trywialny).
P-152619
« 1 » 2
  Strona 1 z 2 Następna strona