Dlaczego podczas usuwania wskaźnika dostaję błąd?

0

Dzień dobry!

Mam sobie klasy :
Sprite
Stack : public Sprite

w klasie, w której chcę użyć stack'u używam tablicy pointerów do Stack

std::vector<Stack*> stack;

i w metodzie, która inicjuje push_backuje(new Stack());

w metodzie, która usuwa wszystkie zasoby klasy robię delete stack[0];

i odpalam aplikację: pojawia się exception thrown - i wskazuje na delete stack[0]

Co jest tego powodem? Dlaczego tak się dzieje? W jaki sposób to naprawić?
Klasy sprite i stack są puste (mają konstruktor, destruktor i jedną metodę, która jest całkowicie pusta).

3

Pokaż MCVE. Prawdopodobnie nie usuwasz elementu z wektora i wykłada się przy drugim delete usuniętego już elementu. Używaj unique_ptr jak homo sapiens sapiens, problem zniknie.

0
class Sprite
{
public:
	Sprite() = default;
	virtual ~Sprite() = default;
	virtual void Draw() const {}
};
class Stack : public Sprite
	{
	public:
		Stack(int _x) {x = _x; }
		~Stack() {}

		void Draw() const override {}
		int x = 0;
	};
class Test
{
public:
	Test() = default;
	~Test() = default;
	void Init()
	{
		stack.push_back(new Stack(5));
	}
	void Free()
	{
		delete stack[0];
		//stack.clear();
	}
	std::vector<Stack*> stack;
};

Używaj unique_ptr jak biały człowiek

Za długo się je pisze i brzydko wyglądają. Nie mam problemów z zapominaniem o delete, jedynie z działalnością :/

1

Nie mam problemów z zapominaniem o delete, jedynie z działalnością :/

Dlaczego podczas usuwania wskaźnika dostaję błąd?

Serio? Taki kod by nie przeszedł code review. Poza tym, twoje MCVE się nie kompiluje: https://wandbox.org/permlink/x55iONUKciHq1Rl8

0
Tracz napisał(a):

Używaj unique_ptr jak biały człowiek

Za długo się je pisze i brzydko wyglądają. Nie mam problemów z zapominaniem o delete, jedynie z działalnością :/

Wniosek jeden -- programujesz sam i małe rzeczy. :)

Rozumiem, że nie będziesz też używał czegoś takiego jak unordered_multimap, bo się długo pisze i zrobisz swoją implementację uomm, która będzie działała tak samo, ale krócej się będzie pisała? Aha, i z ręcznym usuwaniem przez delete? :)

Wybacz złośliwość, ale brzydota unique_ptr (i innych rzeczy) to rzecz dość względna, a długość pisania w ogóle nie wchodzi w grę, bo zamiast pisać auto x = new typ(coś) a potem delete x (i pilnować tego samemu, choć masz od tego komputer) piszesz raz auto x = make_unique<typ>(coś)... Policz znaki, new-delete to 30, make_unique ma 31... :) Jeden znak chcesz oszczędzić ryzykując nieczytelnością i segmentation faultem?

PS. Jak dodasz średniki, to masz 32 do 32... Remis w długości. :P

0

a długość pisania w ogóle nie wchodzi w grę

Wchodzi bo jak chce dodać więcej klas do vektora to musze ciągle pisać std::make_unique<Klasa>(argument) ev. pointer = std::unique_ptr<Klasa>(new Klasa); a tak to tyloo new Klasa()

Poza tym, twoje MCVE się nie kompiluje

Tak
https://wandbox.org/permlink/xy2oI10FMoo58wL3

0

W kodzie, który pokazałeś, poza wyciekiem pamięci nie dzieje się nic innego, na pewno nie ma crasha i double delete.

0

No tak, wyciek jest bo nigdzie nie usuwam pamięci (bo nie wywołuje metody Free) ale w takim wypadku dlaczego podczas włączania aplikacji wyskakuje mi błąd, przenosi mnie do test i wskazuje na delete stack[0]?

1
Tracz napisał(a):

a długość pisania w ogóle nie wchodzi w grę

Wchodzi bo jak chce dodać więcej klas do vektora to musze ciągle pisać std::make_unique<Klasa>(argument) ev. pointer = std::unique_ptr<Klasa>(new Klasa); a tak to tyloo new Klasa()

No wyżej Ci napisałem, żebyś doliczył sobie delete...

PS. Naprawdę, jeśli chcesz programować z ludźmi, to nie żałuj naciśnięć klawiszy... :)

0

Bez MVCE/kodu ciężko powiedzieć, ale zapewne

Prawdopodobnie nie usuwasz elementu z wektora i wykłada się przy drugim delete usuniętego już elementu. Używaj unique_ptr jak biały człowiek, problem zniknie.

Zauważ, ze w przykładowym kodzie ramiesz regułę 3/5/0.

0

Prawdopodobnie nie usuwasz elementu z wektora i wykłada się przy drugim delete usuniętego już elementu.

ale mam tylko jedne element stack[0].

Użyje po prostu smart pointera, a nie się z tym bawię bezsensownie.

Dzięki za pomoc :)

0

Nie mam szklanej kuli. Czy do mechanika samochodowego też idziesz mówiąc "stuka i puka, jak to naprawić", a na prośbę oględzin auta przyjeżdżasz innym, które według ciebie reprezentuje problem?

Przygotuj MVCE albo pokaż kod.

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