【问题标题】:Segmentation fault when adding shared_ptr to list将 shared_ptr 添加到列表时出现分段错误
【发布时间】:2017-03-23 11:39:06
【问题描述】:

让我解释一下。在这种方法中,我试图将新项目推送到列表中。

spContainer ObjectsManager::createContainer(QStringList data, QVector2D onMapPosition) {
    spContainer new_container (new Container());
    new_container->setData(data);
    new_container->setPosistion(onMapPosition);
    containers.push_back(new_container);

    emit containerAdd(new_container->toQVariantMap());

    return new_container;
}

spContainer 是一个类型定义:

typedef std::shared_ptr<Container> spContainer;

containers 是一个 std::list

class ObjectsManager : public QObject {
...
public:
    spContainer createContainer(QStringList data, QVector2D onMapPosition);
...

private: 
    std::list<spContainer> containers;
};

使用QListQVector 时出现同样的错误。 这很奇怪,因为如果我将添加到方法 new QList 并尝试将指针推送到容器中......

spContainer ObjectsManager::createContainer(QStringList data, QVector2D onMapPosition) {
    spContainer new_container (new Container());
    new_container->setData(data);
    new_container->setPosistion(onMapPosition);
    QList<spContainer> conts;
    conts.push_back(new_container);
    //containers.push_back(new_container);

    emit containerAdd(new_container->toQVariantMap());

    return new_container;
}

它会正常工作的!

什么?有什么区别?!有人可以解释一下发生了什么吗?

【问题讨论】:

  • 您的测试并没有真正证明 QList (conts) 有效并且 std::list (containers) 无效。因为它们的作用域不同。
  • @basslo 感谢您的反馈。你说的对!方法无法使用 std::list,因为它在未初始化对象的范围内

标签: qt scope stl shared-ptr


【解决方案1】:

我的错! 问题是我调用了未初始化对象的方法!

解决方法是:

_objManager = spObjectsManager (new ObjectsManager);
_objManager->createContainer(data);

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多