c – 解引用指针向量的迭代器时的Segfault
发布时间:2020-12-16 10:24:28 所属栏目:百科 来源:网络整理
导读:我有一个对象指针向量 std::vectorElement* elements; 在迭代向量时,我想重新引用迭代器以调用对象的方法. std::cout (*it)-getName() std::endl; 这导致了段错误.相关代码如下. 我认为问题在于我如何初始化向量,因为我可以将for循环移动到方法initialize()
我有一个对象指针向量
std::vector<Element*> elements; 在迭代向量时,我想重新引用迭代器以调用对象的方法. std::cout << (*it)->getName() << std::endl; 这导致了段错误.相关代码如下. 我认为问题在于我如何初始化向量,因为我可以将for循环移动到方法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; } 解决方法
您的初始化功能已损坏.您创建本地对象,然后将其地址推送到向量.但是当函数返回时,这些对象被销毁,指针不再有效.除非您需要多态性,否则最简单的修复方法是仅生成Element对象的向量,而不是指针.
std::vector<Element> elements; ... elements.push_back(Element("ice",1)); elements.push_back(Element("fire",2)); 如果您需要多态,那么使用智能指针. std::vector<std::unique_ptr<Element>> elements; ... elements.push_back(std::unique_ptr<Element>(new Element("ice",1))); elements.push_back(std::unique_ptr<Element>(new Element("fire",2))); 如果你继续使用原始指针,那么你需要一些方法来确保对象的持久性,可能是通过用new分配它们.然后,您需要确保在使用它们的每个指针上调用delete.我不推荐这条路线. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |