Debug Assertion Failed C++

Odpowiedz Nowy wątek
2011-09-19 20:34
Navarrano
0

Witam, prosiłbym o nakierowanie gdzie należy szukać błędu w projekcie C++ pisanym w VS 2010. Pod koniec działania programu ( w momencie kiedy powinna zadziałaś funkcja delete [] ) otrzymuję dany komunikat:
http://imageshack.us/photo/my[...]ack.us/img16/6929/errorin.jpg

Z projekcie posiadam plik nagłówkowy "bus.h"

 #pragma once
#include <iostream>
#include <fstream>
#include <string>
#include "mytime.h"

using namespace std;

class bus
{
public:
    bus(void);
    ~bus(void);
    string Number;
    short* Route;
    mytime* DepHoursFromA;
    mytime* DepHoursFromB;

    void ShowDepHours(void);

private:
    static short counter;
    static short AmountOfBuses;
    static string* BusNumbers;
    short NumberOfStopovers;
    short NumberOfDepA;
    short NumberOfDepB;
    bool HasRoute;
};

i plik właściwy "bus.cpp"

#include "bus.h"

short bus::counter = 0;
short bus::AmountOfBuses;
string* bus::BusNumbers;

bus::bus(void)
{
    if( counter == 0 )
    {
        string BusFileName = "bus_numbers.txt";
        ifstream BusFile( BusFileName.c_str() );
        if( !BusFile )
        {
            cout << "Couldn't have found \"" << BusFileName << "\" file" << endl;
            cin.get();
            exit(1);
        }
        BusFile >> AmountOfBuses;
        if( BusFile.fail() )
        {
            cout << "Couldn't have found integer indicating number of buses" << endl;
            cin.get();
            exit(1);
        }
        BusNumbers = new string[AmountOfBuses];
        for( int i = 0; i < AmountOfBuses; i++ )
            BusFile >> BusNumbers[i];
        BusFile.close();
    }

    Number = BusNumbers[counter];
    string FileName = BusNumbers[counter] + ".txt";
    ifstream BusData( FileName.c_str() );
    if( BusData.fail() )
        {
            cout << "Couldn't have found file with data for bus number "<< FileName << endl;
            cin.get();
            exit(1);
        }
    BusData >> NumberOfStopovers;
    if( BusData.fail() )
        {
            cout << "Couldn't have found integer indicating number of stopovers for bus nr " << Number << endl;
            cin.get();
            exit(1);
        }
    Route = new short[NumberOfStopovers];

    for( int i = 0; i < NumberOfStopovers; i++ )
        BusData >> Route[i];
    BusData >> NumberOfDepA;
    DepHoursFromA = new mytime[NumberOfDepA];
    for( int i = 0; i < NumberOfDepA; i++ )
        BusData >> DepHoursFromA[i];

    BusData >> NumberOfDepB;
    DepHoursFromB = new mytime[NumberOfDepB];
    for( int i = 0; i < NumberOfDepB; i++ )
        BusData >> DepHoursFromB[i];

    counter++;
}

bus::~bus(void)
{
    delete [] BusNumbers;
    delete [] Route;
    delete [] DepHoursFromA;
    delete [] DepHoursFromB;
} 

W pliku "main.cpp" tworzę wskaźnik do dynamicznie alokowanej pamięci

bus* Buses = new bus[TG.GiveNrOfBuses()

i wszystko jest OK. Kiedy jednak wykonają się różne polecenia i powinna nastąpić instrukcja

delete [] Buses

to następuje wyżej wymieniony błąd.

W trakcie pisania miałem taką myśl, czy chodzi o to, że próbuję skasować już nieistniejące miejsca w pamięci skoro istnieje destruktor klasy, ale chciałbym aby ktoś biegły w programowaniu potwierdził moje przypuszczenia lub powiedział co może być źle w programie.

Pozostało 580 znaków

2011-09-19 22:41
0

Nie podoba mi się wywoływanie delete na statycznym wskaźniku jakim jest

static string* BusNumbers;

Myślę, że nie powinieneś tego robić. Dlaczego nie użyjesz std::vector?


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-09-19 23:13
Navarrano
0

Przyznam szczerze, że z rozpędu pisałem na tablicach bo się nie przyzwyczaiłem jeszcze do vectorów. Dopiero zaczynam programować ;)

Potwierdzam, skasowanie operacji delete [] dla statycznej tablicy pomogło.

Dziękuję bardzo!

Mimo wszystko powinieneś zwolnić zaalokowaną pamięć, zapoznaj się z std::vector, będzie Ci prościej. :-) - Endrju 2011-09-19 23:15

Pozostało 580 znaków

2011-09-19 23:45
Navarrano
0

Pozmieniałem już prawie wszystkie tablice na

 std::vector

, tylko stanąłem w momencie stworzenia dwuwymiarowej tablicy.

Pierwszą myślą, było zrobienie tego jak przy wskaźnikach do tablic dynamicznych, gdzie deklaracja w pliku nagłówkowym wyglądała

short** Route

Jednak z

std::vector

tak nie można ( albo można tylko nie wiem jak ), więc prosiłbym tylko jeszcze o pomoc w tym problemie :)
Czy po prostu tą jedną tablicę zostawić na wskaźnikach?

Dobra, poszperałem i znalazłem co chciałem ;) Myślę, że od teraz będę już korzystał z std::vector ;) - Navarrano 2011-09-19 23:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0