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++来做? 注意:我使用GCC6.3和C++17仅使用std编译,而不使用boostC+中向量元素共享的分割错误+; 我是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()); //我也尝试过这个程序,但在这一行失败了,尽
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();
}
};