У меня есть вектор указателей объектовSegfault когда разыменования итератора для вектора указателей
std::vector<Element*> elements;
При переборе вектора, я хотел бы удвоить разыменования итератора для вызова методов объекта.
std::cout << (*it)->getName() << std::endl;
Это приводит к segfault. Соответствующий код приведен ниже.
Я думаю, что проблема в том, как я инициализирую вектор, потому что я мог бы перемещать for-loop в метод initialize()
, и он отлично работает. В takeTurn()
вектор имеет соответствующий размер, а указатели содержат правильные адреса. Означает ли это, что объекты, на которые указывают, подвергаются преждевременному уничтожению?
main.cpp:
#include <vector>
#include <iostream>
#include "Element.h"
std::vector<Element*> elements;
void initialize() {
Element ice = Element("ice",1);
Element fire = Element("fire",2);
elements.push_back(&ice);
elements.push_back(&fire);
}
void takeTurn() {
std::vector<Element*>::iterator it;
for(it = elements.begin(); it != elements.end(); ++it) {
std::cout << (*it)->getName() << std::endl;
}
}
int main() {
initialize();
takeTurn();
return 0;
}
Element.h:
#include <string>
class Element {
public:
Element(std::string name, int id);
int getID() { return id_; }
std::string getName() { return name_; }
private:
int id_;
std::string name_;
};
Element.cpp:
#include "Element.h"
Element::Element(std::string name, int id) {
name_ = name;
id_ = id;
}
Все ответы были замечательными, но мне понадобится вектор указателей, поэтому я собираюсь принять этот ответ. Спасибо за дополнительную информацию. –