Funkcje, wskaźniki i obiekty

Odpowiedz Nowy wątek
2019-02-09 19:55
0

Cześć, próbuję ogarnąć operowanie obiektami za pomocą funkcji ze wskaźnikami jako argumentami. Stworzyłem takie coś:

#include <iostream>
#include <string>

using namespace std;

class klasa_C
{
public:
    int liczba;
    string napis;
    int *wskaznik;

    klasa_C()
    {
        liczba=1;
        napis="czesc";
        wskaznik=new int;
        *wskaznik=10;
    }

    ~klasa_C()
    {
        delete wskaznik;
    }
};

void powieksz(klasa_C **pointer, int &rozmiar)
{
    klasa_C *nowy;
    nowy=new klasa_C[rozmiar*2];
    for(int i=0; i<rozmiar; i++)
    {
        *(nowy+i)=**(pointer+i);      //wykrzacza siê tu
    }
    delete [] *pointer;
    *pointer=nowy;
    rozmiar*=2;
}

int main()
{
    int rozmiar=5;
    klasa_C *wskaznik_na_obiekt;
    wskaznik_na_obiekt=new klasa_C[rozmiar];

    for(int i=0; i<rozmiar; i++)
    {
        cout<<"Liczba: "<<(wskaznik_na_obiekt+i)->liczba<<endl;
        cout<<"Napis: "<<(wskaznik_na_obiekt+i)->napis<<endl;
        cout<<"Adres wskaznika: "<<(wskaznik_na_obiekt+i)->wskaznik<<endl;
        cout<<"Liczba pod wskaznikiem: "<<*((wskaznik_na_obiekt+i)->wskaznik)<<endl;
        cout<<endl;
    }

    powieksz(&wskaznik_na_obiekt, rozmiar);
    cout<<endl<<endl;

    for(int i=0; i<rozmiar; i++)
    {
        cout<<"Liczba: "<<(wskaznik_na_obiekt+i)->liczba<<endl;
        cout<<"Napis: "<<(wskaznik_na_obiekt+i)->napis<<endl;
        cout<<"Adres wskaznika: "<<(wskaznik_na_obiekt+i)->wskaznik<<endl;
        cout<<"Liczba pod wskaznikiem: "<<*((wskaznik_na_obiekt+i)->wskaznik)<<endl;
        cout<<endl;
    }

    delete [] wskaznik_na_obiekt;
    return 0;
}

Nie rozumiem dlaczego program się sypie. Prosiłbym też o łopatologiczne wytłumaczenie, z góry dziękuję.

edytowany 1x, ostatnio: furious programming, 2019-02-09 20:11
Debugger z pewnością ci to powie, po co zaraz niepokoić forum? - elwis 2019-02-09 20:21
Nigdy nie lubiłem cukru, ale lukier składniowy po coś jest i myślę, że gdy sobie nim kod udekorujesz, to Ci się wyjaśni - PrezesiQ 2019-02-09 21:04

Pozostało 580 znaków

2019-02-09 21:17

https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/

Twój koda ma dwa problemy:

  1. **(pointer+i) pointer+i zwiększa wskaźnik o i pozycji, ale on wskazuje na zmienną wskazującą na wskaźnik do tablicy. Czyli przesuwając ten wskaźnik będzie wskazywał na coś innego niezdefiniowanego, więc może być crash. Czyli pewnie chciałeś tak: (*pointer)[i]
  2. nie obsługujesz kopiowania/przypisania w klasa_C. Ergo masz po kopiowaniu/przypisaniu masz dwa obiekty wskazujące na ten sam element int i będziesz go zwalniał dwa razy, a równocześnie tracisz kontakt z alkowianą zmienną i masz wyciek. Skończy się crashem podczas wyświetlania Liczba pod wskaznikiem (obiekt już zwolniony).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2019-02-10 20:40

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