C+中向量元素共享的分割错误+; 我是C++新手,我很难理解关系机制。我来自PHP背景,有数据库和ORMs,我无法重现一个非常简单的案例。程序在“atomic.h”第49行{return\uuuuu-atomic\u-fetch\u-add(\uuuu-mem,\uu-val,\uuuu-atomic\u-ACQ\u-REL)}出现分段错误时崩溃。这个问题来自共享_ptr,尽管我真的不知道如何使用智能指针(我已经读了数百篇文章和关于它们的问题,但仍然非常神秘)

C+中向量元素共享的分割错误+; 我是C++新手,我很难理解关系机制。我来自PHP背景,有数据库和ORMs,我无法重现一个非常简单的案例。程序在“atomic.h”第49行{return\uuuuu-atomic\u-fetch\u-add(\uuuu-mem,\uu-val,\uuuu-atomic\u-ACQ\u-REL)}出现分段错误时崩溃。这个问题来自共享_ptr,尽管我真的不知道如何使用智能指针(我已经读了数百篇文章和关于它们的问题,但仍然非常神秘),c++,shared-ptr,C++,Shared Ptr,由于无法在存储库元素上创建工作指针,我试图在类之间建立一对多和多对一关系的尝试都失败了。我一定是漏掉了什么东西,或者也许根本就不应该用C++来做? 注意:我使用GCC6.3和C++17仅使用std编译,而不使用boost class Car:公共启用\u共享\u{ //... } 模板 类存储库{ 媒介收集; 公众: 共享\u ptr getNew(){ 新类型; 收集。推回(新类型); 返回共享\u ptr(&collection.back()); //我也尝试过这个程序,但在这一行失败了,尽

由于无法在存储库元素上创建工作指针,我试图在类之间建立一对多和多对一关系的尝试都失败了。我一定是漏掉了什么东西,或者也许根本就不应该用C++来做?

注意:我使用GCC6.3和C++17仅使用std编译,而不使用boost

class Car:公共启用\u共享\u{
//...
}
模板
类存储库{
媒介收集;
公众:
共享\u ptr getNew(){
新类型;
收集。推回(新类型);
返回共享\u ptr(&collection.back());
//我也尝试过这个程序,但在这一行失败了,尽管它编译得很好。
//返回集合.back().shared_from_this();
}
}
类MainApp{
储存车;
分享我的车;
公众:
MainApp(){
myCar=cars.getNew();
}
}
int main(){
MainApp;//确定-myCar指向cars存储库中的最后一辆车
返回0;//SIGEGV分段错误
}

TLDN'R:您应该在存储库中使用std::shared\u ptr的vector,或者更改
getNewCar
以返回引用

我对您的代码做了一些修改,使输出更加详细:

#include <memory>
#include <iostream>
#include <vector>

class Car
{
public:
    Car()
    {
        std::cout << "Car ctor @" << this << std::endl;
    }

    Car(const Car& car)
    {
        std::cout << "Car copy ctor @" << this << " from " << &car << std::endl;
    }

    Car& operator=(const Car& car)
    {
        std::cout << "Car assign operator @" << this << std::endl;
    }

    ~Car()
    {
        std::cout << "Car dtor @" << this << std::endl;
    }
};

class Repository
{
    std::vector<Car> collection;
public:
    std::shared_ptr<Car> getNewCar()
    {
        Car newType;
        collection.push_back(newType);
        return std::shared_ptr<Car>(&collection.back());
    }
};

int main()
{
    Repository rep;
    std::shared_ptr<Car> myCar = rep.getNewCar();
    return 0;
}
您面临的问题是,您的代码在同一个对象上执行了两次Car destructor,这可能会导致一些奇怪的行为,幸运的是,在您的情况下,这是一个分段错误

在存储库中使用的
std::vector
负责在其对象被销毁时删除其所有对象。最后一个指向某个对象的“std::shared_ptr”也负责这样做

一致:

return shared_ptr<Type>(&collection.back());
如果您确定汽车将在存储库销毁之前销毁:

class Repository
{
    std::vector<Car> collection;
public:
    Car& getNewCar()
    {
        Car newCar;
        collection.push_back(newCar);
        return collection.back();
    }
};
类存储库
{
病媒采集;
公众:
Car&getNewCar()
{
新车;
收集。推回(新车);
返回集合。返回();
}
};

1)使用
std::make_Shared
或使用
new
创建共享指针。看见2) 在向量中有指向元素的指针是不明智的。如果调整向量的大小,这些指针将失效。3) 为什么不先用一个简单的程序来使用shared\u ptr,然后再在一个更大的程序中使用它呢?
一对多
——可以是
std::map
std::unordered\u map
。暂时忽略
从这个
启用共享。阅读关于
unique_ptr
和RAII的内容,然后
shared_ptr
作为对其的扩展应该更有意义。最后,如果你进一步深入研究
共享ptr
的复杂性,你就会明白
从这个
中启用共享\u做了什么。幸运的是,我认为这个问题太广泛了。谢谢大家,我确实走错了路。我现在更了解智能指针的概念了。非常感谢,我终于明白了。我设法使我的整个关系和存储库与共享的ptr向量一起工作。
class Repository
{
    std::vector<std::shared_ptr<Car>> collection;
public:
    std::shared_ptr<Car> getNewCar()
    {
        collection.push_back(std::shared_ptr<Car>(new Car()));
        return collection.back();
    }
};
class Repository
{
    std::vector<Car> collection;
public:
    Car& getNewCar()
    {
        Car newCar;
        collection.push_back(newCar);
        return collection.back();
    }
};