Problem z std::vector.

0

Witam!
Nowy dzień nowe problemy, dzisiaj mam problem dla was pewnie trywialny, dla mnie nie taki oczywisty. Z góry mówię że głowiłem się nad tym cały wczorajszy dzień, szukałem po różnych forach i rzeczy typu konstruktor kopiujący nie działały, na stackoverflow też nie widziałem nic co by mi pomogło.
Mam klasę abstrakcyjną która się nazywa "Turret":

#pragma once
#include <SFML\Graphics.hpp>

class Turret : sf::Drawable
{
public:
	Turret() {};
	Turret(int, int) {};
	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const = 0;
	virtual void Attack()=0;
	virtual float GetRange()=0;

protected:
	int Damage;
	float AttackSpeed;
	float Range;

	std::string TexturePath;
	sf::Texture texture;
	sf::Sprite sprite;
};

i jej dziecko:

#pragma once
#include "Turret.h"

class Cannon : public Turret
{
public:
	Cannon();
	Cannon(int, int);
	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
	virtual void Attack();
	virtual float GetRange();
};

W moim obiekcie mapy mam sobie vector:

std::vector<Turret*>Turrets;

Wywołuje tak:

Turrets.push_back(new Cannon(2,2));

I dochodzimy tutaj do sedna sprawy kiedy próbuje coś włożyć do vectora, push_back czy emplace_back program się po prostu wysypuje. Dodam do tego to że metody Attack() czy inne nie są zaimplementowane po prostu są w pliku .cpp ale puste, tylko draw() jest zaimplentowane.
Błąd jaki mi wyrzuca visual studio:

Exception thrown: read access violation.

std::_Vector_alloc<std::_Vec_base_types<Turret *,std::allocator<Turret *> > >::_Mylast(...) returned 0x18.

1

Jeśli push_back powoduje wyjątek, to prawdopodobnie coś nie tak jest z samym vectorem - może go usunąłeś, uszkodziłeś lub w ogóle nie stworzyłeś.

0

Zadeklarowany jest w pliku .h. A nie ma szans jego uszkodzić bo nawet się do niego nie odwołuje dopiero przy stawianiu wieżyczki

0

No a jak tworzysz Cannon luzem, bez dodawania do vectora, to wszystko jest ok?

0

Tak wszystko jest ok, normalnie stawia mi go.

Edit. jednak nie, przy normalnym obiekcie wszystko jest ok, jeżeli robie wskaźnik na Cannon to wyskakuje mi błąd:
Exception thrown: write access violation.

this was nullptr.

0

Czyli z vectorem musi być coś nie tak. Jeśli jest polem jakiejś klasy, sprawdź, czy wszystko z tą klasą jest ok, czy nie jest gdzieś przypadkiem usuwana/nadpisywana.

0

Po sf::Drawable nie dziedziczy się public?
Anyway, analogiczny kod bez SDL kompiluje się bez problemu http://melpon.org/wandbox/permlink/LqjTUC3GXYC3Mxoj

0

Kod się kompiluje tylko podczas wywoływania Turrets.push_back program się wysypuje

0

Bawiłem się tym debugerem, zrobiłem wskaźnik na Cannon nie w vektorze tylko taki zwykły, no i vs mi pokazuje < Unable to read memory > i błąd.
Exception thrown: write access violation.
this was nullptr.

0

Dziękuje wszystkim za pomoc błędu szukałem gdzie indziej niż był. Problem był w tym że wywoływałem push_back w obiekcie Map, tylko obiekt Map nie miał żadnej wartości był zwykłym wskaźnikiem na nic nie wskazującym. Gdyby nie zwrócenie uwagi na debuger pewnie bym tak siedział wieki na tym kodem.

1

polecam włączyć sobie "address sanitizer" (dostępne dla clang i gcc, nie wiem jak jest w vs).
Bardzo ładnie wykrywa większość błędów pamięci.

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