Klasa stos błąd przy operatorze +=

0

Witam mam problem z operatorem += , terminal wyrzuca mi naruszenie ochrony pamięci.
Wywołanie wygląda następująco(s oraz s2 to obiekty klasy stos).

s2 += s +=s;

co ciekawe gdy zamienię to wywołanie na

s2 += s;
s2 += s;

wszystko wykonuje się poprawnie.

Sam kod operatora wygląda następująco

Stack & operator+= (Stack s)
{
			
			for(int i=0;i<s.top;i++)
			{
				this->stos[this->top]=s.stos[i];

				this->top++;
			
			}
			
			return *this;
}

1

To pierwsze wywołanie odpowiada:

s += s;
s2 += s;
0

Tak wiem ale koniecznie musi to działać dla wywołania
s2 += s +=s;

0

Zrób własny konstruktor kopiujący.

0

Niestety nie pomogło, albo coś po prostu źle robie.

Stack()
		{
			size=5;
			stos=(int *)malloc(sizeof(int)*size);
			top=0;
		}
		Stack(const Stack & stosik)
		{
			size=stosik.size;
			stos=stosik.stos;
			top=stosik.top;
			cout<<"Konstruktor kopiujacy"<<endl;
		}

0
Stack & operator+= (Stack s)
{

            for(int i=0;i<s.top;i++)
            {
                this->stos[this->top]=s.stos[i];

                this->top++;

            }

            return *this;
}

Zastanów się co tu się dzieje jak s i *this to ten sam obiekt. Kiedy kończy się ta pętla?

2

stos=stosik.stos; Zrobiłeś to samo co domyślny konstruktor kopiujący czyli nowy obiekt operuje na tym samym obszarze pamięci. W destruktorze nowy obiekt zwolni ten obszar a poprzedni obiekt dalej będzie go używał.
Skopiuj zawartość a nie przypisuj.

0

Jeżeli dobrze widzę to będzie to pętla nieskończona. Udało się pokonać problem.

1

Pierwszy problem jaki widzę, to przekazywanie s przez wartość.
Zgaduję, że nie masz prawidłowo zaimplementowanego copy constructor, więc leci crash z powodu podwójnego zwolnienia.

Drugi problem jaki widzę, to beztroskie dodawania nowych elementów. Co jeśli rozmiar tablicy this->stos ci się skończy? Nie ma żadnych zabezpieczeń, co też może prowadzić do crash-a.

A teraz wędka zamiast ryby:
Jak leci ci crash podczas debugowania, program się zatrzyma, a debugger pokaże miejsce wystąpienia.
Odszukaj okienko "call stack" tam zobaczysz jak funkcja była wywołana. Przeklinaj wszystkie pozycje w call stack (IDE będzie ci pokazywać powiązany kod) i zastanów się co jest źle.

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