有没有办法为容器保留内存块?

时间:2011-09-15 19:28:09

标签: c++ segmentation-fault set

我希望我能说清楚......

在我的代码中,我定义了一个box,其中包含一组元素(bead):

vector<vector<vector<set<std::tr1::shared_ptr<bead> > > > > boxes;

我使用以下内容向box添加元素:

boxes[i][j][k].insert(aBead);

出于某种原因,我在这里遇到了分段错误。据我所知,由于非法beadijk,所有分段错误都不会发生,因为它们都小于框的大小而不是负。

如果你想知道珠子是:

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
}

2 个答案:

答案 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视图。如果您只需要稀疏点,则可以选择以三元组键入的地图。