Problem z std::vector.

Problem z std::vector.
ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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":

Kopiuj
#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:

Kopiuj
#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:

Kopiuj
std::vector<Turret*>Turrets;

Wywołuje tak:

Kopiuj
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.

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
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ś.

ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0

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

ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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.

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
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.

several
  • Rejestracja: dni
  • Ostatnio: dni
0

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

ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

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

ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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.

ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
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.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.