• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++ dziwny błąd przy inicjalizacji jednej z pól klasy

Object Storage Arubacloud
0 głosów
113 wizyt
pytanie zadane 13 czerwca 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 13 czerwca 2019 przez dawid2002

Witam! Ostatnio napisałem sobie taki skromny szablon klasy:

template <typename TYP>
class TArray
{
	TYP* m_pTablica;
	unsigned m_uRozmiar;

public:
        TArray(unsigned uSize)  : m_uRozmiar(uSize),  m_pTablica(new TYP [m_uRozmiar]) { }

        ~TArray() { delete[] m_pTablica; }

        TYP& operator[](unsigned uIndeks) { return m_pTablica[uIndeks]; }

};

Wszystko jest dobrze aż gdy skompiluje jeszcze taki kod:

TArray<int> ob(4);

ob[2] = 45;

cout << ob[2] << endl;

Wtedy wyskakuje wyjątek "bad_array_new_length". Gdy sprawdziłem w VS co wywołało błąd to okazało się że w instrukcji: new TYP[m_uRozmiar]; doszło do błędnej alokacji pamięci z wartością ujemną zamiast liczby 4.

Zatem zmieniłem kod konstruktora na:

TArray(unsigned uSize)  : m_uRozmiar(uSize),  m_pTablica(new TYP [uSize]) { }
// "new TYP[m_uRozmiar]" zostało zmienione na "new TYP [uSize]"

I teraz wszystko nagle działa!

Dlaczego została przekazana błędna wartość?

A może m_uRozmiar nie został zainicjalizowany , ale jak to się stało?

komentarz zamknięcia: znam już odpowiedź

1 odpowiedź

+1 głos
odpowiedź 13 czerwca 2019 przez criss Mędrzec (172,590 p.)
wybrane 13 czerwca 2019 przez dawid2002
 
Najlepsza

Będzie działać jeśli zamienisz kolejność deklaracji pól w klasie. Tzn. tak:

    unsigned m_uRozmiar;
    TYP* m_pTablica;

Pola klasy są inicjalizowane zgodnie z tą kolejnością, niezależnie od kolejności w liście inicjalizacyjnej. Stąd obecnie podczas wywołania `new[]` m_uRozmiar było niezainicjalizowane.

Kompilator powinien dawać ci warningi odnośnie tej rozbieżności (między kolejnością inicjalizacji i kolejności występowania w liście inicjalizacyjnej). Jeśli tak nie jest, to być może powinieneś włączyć bardziej restrykcyjne zgłaszanie warningów.

komentarz 13 czerwca 2019 przez dawid2002 Mądrala (5,190 p.)

Wielkie dziękiyes

Podobne pytania

0 głosów
0 odpowiedzi 83 wizyt
pytanie zadane 8 lipca 2018 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)
–1 głos
1 odpowiedź 164 wizyt
0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 18 stycznia 2022 w C i C++ przez Fluxik Nowicjusz (240 p.)

92,566 zapytań

141,420 odpowiedzi

319,614 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...