我希望我能说清楚......
在我的代码中,我定义了一个box
,其中包含一组元素(bead
):
vector<vector<vector<set<std::tr1::shared_ptr<bead> > > > > boxes;
我使用以下内容向box
添加元素:
boxes[i][j][k].insert(aBead);
出于某种原因,我在这里遇到了分段错误。据我所知,由于非法bead
和i
,j
,k
,所有分段错误都不会发生,因为它们都小于框的大小而不是负。
如果你想知道珠子是:
class particle{
public:
vec pos;
vec oldPos;
vec vel;
vec F;
vec oldF;
int charge;
int type;
double U;
double nextU;
};
class bead: public particle{
public: //most of this is redundant...
int charge;
int type;
double rho;
double nextRho;
int LID;
bool keep;
bool touch;
double radius;
}
class vec{
public:
double x;
double y;
double z;
velarray<double> coor; //on it's way to being canceled
}
答案 0 :(得分:4)
创建shared_ptr<T>
时,您需要使用指向使用new
关键字创建的对象类型的指针来启动它,而不是使用实际对象或对象引用。例如:
shared_ptr<bead> ptr(new bead);
不
bead aBead;
shared_ptr<bead>(aBead);
BTW,不要执行以下操作:
bead* ptr = new bead();
shared_ptr<bead> sptr(ptr);
delete ptr;
shared_ptr<bead>
对象管理指针的生命周期。它将引用计数指针,并在没有对指针的更多引用时在delete
析构函数内部对指针调用shared_ptr<T>
。如果在初始化delete
对象后手动调用指针上的shared_ptr<T>
,则最终会出现分段错误,因为您基本上已尝试自行管理内存生命周期,从而失败托管“智能”指针的整个指针,如shared_ptr<T>
。
答案 1 :(得分:2)
如果您支持C ++ 11,那么制作动态对象和共享指针的首选方法是make_shared
:
boxes[i][j][k].insert(std::make_shared<Bead>());
如果不这样做,您将不得不自己执行动态分配,但从那时起,对象的生命周期将由共享指针管理:
boxes[i][j][k].insert(new Bead);
但是,您可能希望更改数据结构,以避免过度使用容器。每个容器都会产生分配,这可能会变得很昂贵。如果您需要密集填充3D空间,那么您可以使用可以大步访问的展平的1D视图。如果您只需要稀疏点,则可以选择以三元组键入的地图。