Co jest nie tak?

0

Witam

Mam małe pytanie do was. Otóż w ramach ćwiczeń z C++ postanowiłem sobie napisać szablon klasy tablicy dynamicznej. i napisałem sobie coś takiego:

#include <iostream>
#include <conio.h>

typedef unsigned int Uint;

template<class type>
class Array
{

private:

    type * Data;
    Uint Size;

public:
    //konstruktor
    Array();
    Array(Uint HowIndex);
    //destruktor
    ~Array();
    //metody zwracajace
    Uint Length(); //zwraca ilosc elementow tablicy
    Uint High(); //zwraca index ostatniego elementu
    Uint GetFirstEmptyIndex();
    Uint GetLastEmptyIndex();
    //operator
    type& operator[](const Uint Index)
    {
        return Data[Index];
    };
    //metody robiace cos
    void Clear();

};

template<typename type> 
Array<type>::Array()
{
    Size = 1;
    type * Data = new type[Size];
};

template<typename type> 
Array<type>::Array(Uint HowIndex)
{
    Size = HowIndex;
    type * Data = new type[Size];
};

template<typename type> 
Array<type>::~Array()
{
    delete [] Data;
};

template<typename type> 
void Array<type>::Clear()
{
    delete [] Data;
};

template<typename type> 
Uint Array<type>::Length()
{
    return Size;
};

template<typename type> 
Uint Array<type>::High()
{
    return (Size-1);
};

template<typename type> 
Uint Array<type>::GetFirstEmptyIndex()
{
    bool LoopOff = false;
    Uint I;
    while (LoopOff = true)
    {
        if(Data[I] = 0)
        {
            return I;
            LoopOff = true;
        } else I++;
    };
};

template<typename type> 
Uint Array<type>::GetLastEmptyIndex()
{
    bool LoopOff = false;
    Uint I = High();
    while (LoopOff = true)
    {
        if(Data[I] = 0)
        {
            return I;
            LoopOff = true;
        } else I--;
    };
};

typedef Array<int> Int_Array;
typedef Array<float> Flt_Array;
typedef Array<bool> Bl_Array;

int main()
{
    Int_Array a(350000);
    Flt_Array b(400000);
    Bl_Array c(500000);
    getch();
    a.Clear();
    b.Clear();
    c.Clear();
    getch();
};

I tu rodzi się pytanie. Dlaczego VC++ Express 2010 wywala mi wyjątek w deallokacji pamięci metodą Clear() o treści:

Unhandled exception at 0x59f059da (msvcr100d.dll) in resoruces test.exe: 0xC0000005: Access violation reading location 0xccccccc0.

a Dev-C++ nie, tylko nie dealokuje pamięci poprawnie i powstaje wyciek?

0
lewy_0247 napisał(a):

template<typename type="type">
Array<type>::Array()
{
Size = 1;
type * Data = new type[Size];
};
Tworzysz zmienną lokalną Data a to przecież nie o to chodzi ;)
Poza tym do porównania używa się operatora porównania ==, a nie przypisania =.

0

Dodatkowo dwa razy zwalniasz pamięć - raz w metodzie Clear, a raz w destruktorze.

0

O właśnie - w metodzie Clear powinieneś przypisać wskaźnikowi danych wartość NULL aby oznaczyć ten wskaźnik jako zwolniony.

0
lewy_0247 napisał(a):
bool LoopOff = false;
while (LoopOff = true)
{
if(Data[I] = 0)
{
return I;
LoopOff = true;
} else I--;
};

protip: return wychodzi też z pętli... (pomijam że ten kod w ogóle jest źle napisany i nie zadziała)

0

Faktycznie, zamiast alokować pole klasy, alokowałem zmienną w funkcji. Teraz działa i huczy ;)

Clear() i destruktor też poprawiłem i te o pustych funkcje o pustych wartościach też poprawię, ale to w swoim czasie.

Bardzo dziękuję za pomoc. Temat do zamknięcia.

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