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

Wskaźniki [C++]

Ostatnio zmodyfikowano 2014-05-31 18:06
Autor Wiadomość
IllidanRP
Temat założony przez niniejszego użytkownika
Wskaźniki [C++]
» 2014-05-31 09:20:42
Witam

mam problem prowdopodobnie ze wskaźnikami. Program przy usuwaniu wskaźników, sypie się. Z tego co ustaliłem na usunięciu wskaźnika do obiektu klasy.

C/C++
//deklaracja inportow libow
#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
#include <windows.h>

#include "CLASS\Postac_class.h"
#include "CLASS\Enemy_class.h"
#include "CLASS\Gracz_class.h"
#include "FUNCTION\dmg_func.h"
#include "FUNCTION\dmg_si_func.h"
#include "FUNCTION\zapisz_func.h"
#include "FUNCTION\odczyt_func.h"
#include "FUNCTION\print_func.h"
#include "FUNCTION\color_func.h"
#include "LEVELS\trener_lvl.h"
#include "LEVELS\las_lvl.h"
#include "LEVELS\dziedziniec_lvl.h"
#include "LEVELS\mury_lvl.h"
#include "LEVELS\komnaty_lvl.h"
#include "LEVELS\finall_lvl.h"
#include "FUNCTION\save_func.h"
#include "FUNCTION\load_func.h"
using namespace std;

//deklaracja funkcji

/////////////////////////////////////////////////////

int kill()
{
    cin.get();
    cin.ignore();
    return 0;
}

/////////////////////////////////////////////////////

int main()
{
    //deklaracja zamiennych
   
    string imie_gracza;
    int ID = 0;
    int * ID_ = & ID;
    int wyb1;
    int wyb2;
    int wyb3;
    char cwyb1[ 256 ], cwyb2[ 256 ];
    bool h = true, handle = true;
    int flag1 = 0;
    int * flag1_ =& flag1;
    int flag2 = 0;
    int * flag2_ = & flag2;
    int flag3 = 0;
    int * flag3_ =& flag3;
    int flag4 = 0;
    int * flag4_ =& flag4;
    int flag5 = 0;
    int * flag5_ =& flag5;
    Gracz * gracz_;
    int * liczba_lini_;
    int liczba_lini = 0;
    int * hp_;
    int hp = 0;
    int * obr_min_;
    int obr_min;
    int * obr_max_;
    int obr_max;
    int * gold_;
    int gold;
    int * score_;
    int score;
    string * name_;
    string name;
    bool menu = true;
   
    int debug;
    string debugs;
    Gracz debugg( 0, 0, 0, 0, 0, 0, "" );
   
    //tworzenie obiektow
   
   
   
    /////////////////////////////////////////////////////
   
    //start gry
    niebieski_mat(); cout << "===============================================================================" << endl << endl;
    niebieski(); cout << print( "    Text_rpg_game v0.2.0d\n\n    by Szymon \"Szymi_01\" Oszmana, Jarosław \"Anioł\" Aniołek, Kamil Konofał\n\n" );
    niebieski_mat(); cout << "===============================================================================" << endl << endl;
    standardowy();
    while( menu == true )
    {
        zielony();
        cout << "MENU:\n\n";
       
        zielony_mat();
        do
        {
            cout << print( "[1]nowa gra\n" );
            cout << print( "[2]wczytaj grę\n" );
            cout << print( "[3]tablica wyników\n" );
            cout << print( "[0]wyjście\n" );
            cout << ">>";
            cin >> cwyb2;
            if( cwyb2[ 0 ] >= 48 && cwyb2[ 0 ] <= 57 )
            {
                wyb2 = cwyb2[ 0 ] - 48;
            }
            else
            {
                cout << "podaj odpowiedni znak!!!\n";
                wyb2 = - 1;
            }
            if( wyb2 == 1 || wyb2 == 0 || wyb2 == 2 || wyb2 == 3 )
                 h = false;
           
        } while( h == true );
       
        standardowy();
        switch( wyb2 )
        {
        case 1:
            {
                niebieski_mat(); cout << "\n\n===============================================================================" << endl << endl;
                cout << "     SAMOUCZEK\n\n";
                cout << print( "Witamy w grze.\nSterowanie odbywa się za pomocą klawiatury numerycznej (wyjątkiem nazwa gracza).Wybranie opcji drogi do zamku przekieruje Cię do następnego przeciwnika.\nU trenera istnieje możliwosć ulepszenia swoich statystyk\nPowrót do domu spowoduje zapis progresu gry.\n\n" );
                cout << print( "Wszelkie rodzaje menu wyboru będą oznaczone kolorem" ); zielony_mat(); cout << " zielonym.\n"; standardowy();
                cout << print( "Walka jest przedstawiona za pomocą koloru" ); czerwony(); cout << " czerwonego"; standardowy(); cout << " oraz"; czerwony_mat(); cout << " czerwonego.\n"; standardowy();
                cout << print( "Fabuła, teksty oraz dialogi wyświetlane będą w kolorze" ); bialy(); cout << " bialym,\n"; standardowy(); cout << print( "lub " ); turkusowy_mat(); cout << "turkusowym.\n\n";
                niebieski_mat(); cout << "===============================================================================" << endl << endl; standardowy();
                bialy(); cout << print( "Tutaj jest kres Twej wędrówki. Docierasz do małej wsi pod zamkiem.\nW powietrzu unosi sie zapach stęchlizny." );
                cout << print( " Ludzie spoglądają na Ciebie złowrogo.\nKierujesz się w stronę miejscowej tawerny. " );
                cout << print( "Wchodzisz i zaczepia Cię\nkarczmarz, z kuflem miejscowego browaru w ręku. Mowi:\n" );
                cout << print( "\"Witaj podróżniku, jak Ci na imię?\"\n\n" );
                siwy(); cout << ">>  ";
                cin >> imie_gracza; standardowy();
                cout << endl;
                bialy(); cout << print( "Wciska Ci do ręki kufel i gestem dłoni zaprasza do stolika. Po kilku kuflach\nna koszt firmy opowiada Ci o krainie, do której przybyłeś:\n" );
                cout << print( "\"Tutaj... tutaj nie ma miejsca dla bohaterów, czy ludzi dobrych. Nasz pan,\nCzarny Lord, tak każe się zwać, nie jest wymarzonym władcą. " );
                cout << print( "Widzę, że jesteś\nwojownikiem. Może Tobie uda się go pozbyć.\"\n" );
                cout << print( "Ty, przechylając kufel, wypijając piwo mówisz:\n" );
                cout << print( "\"Zostanę tutaj przez jakis czas. Może się zaintersuję.\"\n" );
                cout << print( "Karczmarz wskazuje Ci pewnego mężczyznę w ciemnym płaszczu, siedzącego samotnie w kącie.\nMówi:\n" );
                cout << print( "\"To miejscowy kowal, alchemik, wojownik, mag i doskonały trener. Udaj się do\nniego, napewno pomoże Ci za drobną opłatą.\"\n" );
                cout << print( "Wstajesz i wolnym, chwiejnym krokiem udajesz się na miejsce spoczynku.\nZwęszywszy złoto i sławe, postanawiasz uporać się z niedobrym władcą.\n\n\n" );
                turkusowy(); cout << " -- ETAP 1 --\n\n";
                turkusowy_mat(); cout << print( "Droga do zamku prowadzi przez mroczny las, w którym wielu śmiałków wyzionęło\njuż ducha. Poczynając od groźnych zwierząt, po nieznane twory natury. Przed\npodróżą w te nieznane strony warto podszkolić swoje umiejętności i wyposażyć\nsię w lepszy oręż.\n\n" ); standardowy();
               
                Gracz gracz( ID, 100, 5, 10, 100, 0, imie_gracza );
                gracz_ = & gracz;
                ID++;
               
                while( handle == true && gracz.Give_STATE() == true )
                {
                   
                   
                    do
                    {
                        niebieski_mat(); cout << "===============================================================================" << endl << endl; standardowy();
                        zielony(); cout << print( "Gdzie chcesz się udać?\n\n" ); zielony_mat(); cout << print( "[1] W stronę zamku, czas stanąć oko w oko z przeznaczeniem.\n[2] Do trenera, przydałoby się trochę podszkolić.\n[0] Wróć do rodzinnego domu, to nie na Twoje nerwy.\n" ); zielony_mat(); cout << ">> ";
                        cin >> cwyb1;
                        cout << endl;
                       
                        if( cwyb1[ 0 ] >= 48 && cwyb1[ 0 ] <= 57 )
                        {
                            wyb1 = cwyb1[ 0 ] - 48;
                        }
                        else
                        {
                            wyb1 = - 1;
                        }
                       
                        switch( wyb1 )
                        {
                        case 0:
                            h = false;
                            break;
                        case 1:
                            h = false;
                            break;
                        case 2:
                            h = false;
                            break;
                        default:
                            cout << print( "Błędne dane. Spróbuj jeszcze raz. \n\n" );
                        }
                       
                    } while( h == true );
                   
                    switch( wyb1 )
                    {
                    case 1:
                        if( flag1 < 5 )
                             las_lvl( gracz_, ID_, ID, flag1, flag1_ );
                        else if( flag2 < 5 )
                             dziedziniec_lvl( gracz_, ID_, ID, flag2, flag2_ );
                        else if( flag3 < 5 )
                             mury_lvl( gracz_, ID_, ID, flag3, flag3_ );
                        else if( flag4 < 5 )
                             komnaty_lvl( gracz_, ID_, ID, flag4, flag4_ );
                        else if( flag5 == 0 )
                        {
                            finall_lvl( gracz_, ID_, flag5_ );
                            handle = false;
                           
                        }
                        break;
                    case 2:
                        Trener( gracz_ );
                        break;
                    case 0:
                        handle = false;
                        break;
                    }
                }
                if( gracz.Give_STATE() == true )
                {
                    if( flag5 == 0 )
                    {
                        niebieski_mat(); cout << "===============================================================================" << endl << endl;
                        turkusowy_mat(); cout << print( "Uznając że zadanie Cię przerasta, wracasz do domu." ); standardowy();
                        if( Save_func( gracz_, flag1, flag2, flag3, flag4, flag5 ) == true )
                        {
                            zielony(); cout << print( "\nZAPISANO STAN GRY!!!" );
                        }
                        else
                        {
                            czerwony(); cout << print( "\nBŁĄD PRZY ZAPISYWANIU STANU GRY!!!" );
                        }
                        standardowy();
                    }
                    else
                    {
                        niebieski_mat(); cout << "===============================================================================" << endl << endl;
                        turkusowy_mat(); cout << print( "GRATULACJE!!! Włśnie ukończyłaś/eś tą gre !!!\n" );
                        if( Zapisz_func( gracz.Give_name(), gracz.Give_score() ) == true )
                        {
                            zielony(); cout << print( "Zapisano Twój wynik." ); standardowy();
                        }
                        else
                        {
                            czerwony(); cout << print( "Podczas zapisywania wyniku nastąpił błąd" ); standardowy();
                        }
                        standardowy();
                    }
                   
                }
                else
                {
                    niebieski_mat(); cout << "===============================================================================" << endl << endl;
                    czerwony_mat(); cout << print( "Właśnie poznałeś smak śmierci...\n" );
                    if( Zapisz_func( gracz.Give_name(), gracz.Give_score() ) == true )
                    {
                        zielony(); cout << print( "Zapisano Twój wynik." ); standardowy();
                    }
                    else
                    {
                        czerwony(); cout << print( "Podczas zapisywania wyniku nastąpił błąd" ); standardowy();
                    }
                }
            }
            break;
        case 3:
            {
                liczba_lini_ =& liczba_lini;
                Odczyt_func( liczba_lini_, 1 );
                break;
            }
        case 2:
            {
                liczba_lini_ = & liczba_lini;
                Odczyt_func( liczba_lini_, 0 );
                cout << print( "który stan gry chcesz wczytać?\n" );
                do
                {
                    cout << ">>";
                    cin >> wyb3;
                    if( wyb3 < 1 or wyb3 > liczba_lini )
                    {
                        cout << print( "błędna liczzba" );
                    }
                } while( wyb3 < 1 or wyb3 > liczba_lini );
               
                hp_ = & hp;
                obr_min_ =& obr_min;
                obr_max_ =& obr_max;
                gold_ =& gold;
                score_ =& score;
                name_ =& name;
                wyb3--;
                Load_func( wyb3, ID_, hp_, obr_min_, obr_max_, gold_, score_, name_, flag1_, flag2_, flag3_, flag4_, flag5_ );
                Gracz gracz( ID, hp, obr_min, obr_max, gold, score, name );
                gracz_ = & gracz;
                ID++;
                while( handle == true && gracz.Give_STATE() == true )
                {
                   
                   
                    do
                    {
                        niebieski_mat(); cout << "===============================================================================" << endl << endl; standardowy();
                        zielony(); cout << print( "Gdzie chcesz się udać?\n\n" ); zielony_mat(); cout << print( "[1] W stronę zamku, czas stanąć oko w oko z przeznaczeniem.\n[2] Do trenera, przydałoby się trochę podszkolić.\n[0] Wróć do rodzinnego domu, to nie na Twoje nerwy.\n" ); zielony_mat(); cout << ">> ";
                        cin >> cwyb1;
                        cout << endl;
                       
                        if( cwyb1[ 0 ] >= 48 && cwyb1[ 0 ] <= 57 )
                        {
                            wyb1 = cwyb1[ 0 ] - 48;
                        }
                        else
                        {
                            wyb1 = - 1;
                        }
                       
                        switch( wyb1 )
                        {
                        case 0:
                            h = false;
                            break;
                        case 1:
                            h = false;
                            break;
                        case 2:
                            h = false;
                            break;
                        default:
                            cout << print( "Błędne dane. Spróbuj jeszcze raz. \n\n" );
                        }
                       
                    } while( h == true );
                   
                    switch( wyb1 )
                    {
                    case 1:
                        if( flag1 < 5 )
                             las_lvl( gracz_, ID_, ID, flag1, flag1_ );
                        else if( flag2 < 5 )
                             dziedziniec_lvl( gracz_, ID_, ID, flag2, flag2_ );
                        else if( flag3 < 5 )
                             mury_lvl( gracz_, ID_, ID, flag3, flag3_ );
                        else if( flag4 < 5 )
                             komnaty_lvl( gracz_, ID_, ID, flag4, flag4_ );
                        else if( flag5 == 0 )
                        {
                            finall_lvl( gracz_, ID_, flag5_ );
                            handle = false;
                           
                        }
                        break;
                    case 2:
                        Trener( gracz_ );
                        break;
                    case 0:
                        handle = false;
                        break;
                    }
                }
                if( gracz.Give_STATE() == true )
                {
                    if( flag5 == 0 )
                    {
                        niebieski_mat(); cout << "===============================================================================" << endl << endl;
                        turkusowy_mat(); cout << print( "Uznając że zadanie Cię przerasta, wracasz do domu." ); standardowy();
                        cout << "tu";
                        if( Save_func( gracz_, flag1, flag2, flag3, flag4, flag5 ) == true )
                        {
                            zielony(); cout << print( "\nZAPISANO STAN GRY!!!" );
                        }
                        else
                        {
                            czerwony(); cout << print( "\nBŁĄD PRZY ZAPISYWANIU STANU GRY!!!" );
                        }
                        standardowy();
                    }
                    else
                    {
                        niebieski_mat(); cout << "===============================================================================" << endl << endl;
                        turkusowy_mat(); cout << print( "GRATULACJE!!! Włśnie ukończyłaś/eś tą gre !!!\n" );
                        if( Zapisz_func( gracz.Give_name(), gracz.Give_score() ) == true )
                        {
                            zielony(); cout << print( "Zapisano Twój wynik." ); standardowy();
                        }
                        else
                        {
                            czerwony(); cout << print( "Podczas zapisywania wyniku nastąpił błąd" ); standardowy();
                        }
                       
                    }
                   
                }
                else
                {
                    niebieski_mat(); cout << "===============================================================================" << endl << endl;
                    czerwony_mat(); cout << print( "Właśnie poznałeś smak śmierci...\n" );
                    if( Zapisz_func( gracz.Give_name(), gracz.Give_score() ) == true )
                    {
                        zielony(); cout << print( "Zapisano Twój wynik." ); standardowy();
                    }
                    else
                    {
                        czerwony(); cout << print( "Podczas zapisywania wyniku nastąpił błąd" ); standardowy();
                    }
                    standardowy();
                }
               
            }
            break;
        case 0:
            {
                menu = false;
                break;
            }
        }
    }
   
    gold_ =& debug;
    score_ =& debug;
    hp_ =& debug;
    obr_min_ =& debug;
    obr_max_ =& debug;
    ID_ =& debug;
    name_ =& debugs;
    gracz_ =& debugg;
   
    delete hp_;
    delete obr_min_;
    delete obr_max_;
    delete gold_;
    delete score_;
    delete name_;
    delete liczba_lini_;
    delete gracz_; //tutaj się sypie
    delete ID_;
    delete flag1_;
    delete flag2_;
    delete flag3_;
    delete flag4_;
    delete flag5_;
   
    kill();
}

sprawidzłem debugerem i o to co wyświetla:


ntdll!RtlGetCompressionWorkSpaceSize()
ntdll!RtlGetCompressionWorkSpaceSize()
msvcrt!free()
??()
main() SOURCE/main.cpp 431

program się kompiluje, jeśli bedzie potrzebny cały to proszę napisać na tego maila: jarekani@gmail.com
z chęcią podeśle paczkę.

dodam, że wcześniej przed wstawieniem pętli while: while(menu==true), wszystko działało.

Pozdrawiam i liczę na szybką pomoc

IllidanRP

EDIT: problem rozwiązany. wystarczyło nadać ślepym wskaźnikom adres NULL. zamykam
P-111144
ison
» 2014-05-31 11:02:16
Usuwasz ID_, które nie jest zaalakowane dynamicznie (już pomijając te przypisania do debug)
P-111151
IllidanRP
Temat założony przez niniejszego użytkownika
» 2014-05-31 11:08:50
więc jak to powinno wyglądać
P-111152
ison
» 2014-05-31 11:11:10
A, nawet nie spojrzałem dalej. Tu nic nie jest alokowane dynamicznie. Jeśli nie uzywasz new to nie możesz użyć delete.
P-111153
IllidanRP
Temat założony przez niniejszego użytkownika
» 2014-05-31 11:19:17
więc wszystkie delete mogę posłać do piachu i nie będzie wycieku pamięci?
P-111154
ison
» 2014-05-31 12:19:47
Zgadza się. Zmienne lokalne zostaną usunięte po wyjściu ze swojego scope'a. Delete usuwa to na co wskazuje wskaźnik, a nie sam wskaźnik. Nie wiem po co dla każdej zmiennej lokalnej deklarujesz osobno wskaźnik do niej.
P-111155
IllidanRP
Temat założony przez niniejszego użytkownika
» 2014-05-31 18:06:07
są one wykorzystywane dalej w programie, i zmieniane w nim. Dzięki za pomoc i wyjaśnienie
P-111172
« 1 »
  Strona 1 z 1