加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.我不推荐这条路线.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读