清除并重新填充std :: vector <std :: vector <t>&gt;造成分配麻烦</std :: vector <t>

时间:2013-12-12 18:55:28

标签: c++ vector allocation memory-management

我将数据存储在双std::vector结构中,我需要能够重复填充和清除:这导致了一些我不理解的分配问题。

我正在使用结构vector<Coefficients *> XSims,其中Coefficients采用

形式
class Coefficients{
int N;
 public:
vector<gsl_vector *> Coefs;
//Iterator to traverse the vector structure.
vector<gsl_vector*>::iterator it;
void it_start(){
    it = Coefs.begin();
}
void it_end(){
    it = Coefs.end();
}
void it_next(){
    ++it;
}
void it_prev(){
    --it;
}
bool not_end(){
    return it < Coefs.end();
}
    //Return number of vectors contained.
size_t length(){return Coefs.size();}

//Append pointer to outside data into the Coefs structure.
void append( gsl_vector * X ){
    Coefs.push_back(X);
}

Coefficients(int N1) : N(N1) {
    Coefs.reserve(N);
}
    //Clean up procedure
void Clear(){
    //Forward iterator.
    it_start();
    while(not_end()){
        gsl_vector_free((*it));
        it_next();
    }
    Coefs.clear();
}

~Coefficients(){
    //Forward iterator.
    Clear();
    Coefficients::Coefs.clear();
}
 };

我使用以下迭代器来绕过XSim

    vector<Coefficients *>::iterator Xit;
inline void Xstart(){Xit = XSims.begin();}
inline void Xend(){Xit = XSims.end();}
inline void X_next(){++Xit;}
inline void X_previous(){--Xit;}
inline bool X_not_end(){return {Xit < XSims.end()};}

我正在努力组合使用的两个功能如下:

inline void Simulate(){
    XSims.reserve(N+1);
    Xstart();

    for(int i=0;i<N; i++){
        //Build a container to insert into XSims
        Coefficients * XsimsIteration = new Coefficients(1000);
        // time points to previous vector of simulations.

        (*Xit)->it_start();

        for(int m=0;m<1000;m++){
            //Allocate free space for the components of the DW and Xsims.
            gsl_vector * X = gsl_vector_alloc(X0.X0->size);
            XsimsIteration->append(X);

                   gsl_vector_memcpy(X,(*Xit));

            //Next simulation
            (*Xit)->it_next();
        }
        cout << "Number of sims being inserted into X = " << XsimsIteration->length() << endl;
        //Insert XsimsIteration into the XSims container
        XSims.push_back(XsimsIteration);


        //next time point
        X_next();
        cout << "Number of simulations stored in X = " << (*Xit)->length() << endl;
    }
}

inline void XW_clear(){
    Xstart();
    //Don't want to clear the initial values, so step forward!
    X_next();
    while(X_not_end()){
        (*Xit)->Clear();
        X_next();
    }
    XSims.clear();
}

我想在循环中运行这两个函数:在使用初始XSims(永远不会被清除)初始化Coeffiecient*之后,我运行

Simulate();
XW_clear();
Simulate();

前两个函数运行正常,但第二个Simulate()在运行时崩溃。基本上,似乎不想在第二个外循环上push_back XsimsIteration:我得到了奇怪的输出:

Number of sims being inserted into X = 1000
Number of simulations stored in X = 0

第二个Number of simulations stored in X实际上应与第一个{{1}}相同,即1000。

3 个答案:

答案 0 :(得分:0)

您的测试结果不正确

inline bool X_not_end(){return {Xit < XSims.end()};}

如果你有普通的C / C ++数组,这种测试会起作用,但不需要使用容器。测试应为Xit != XSims.end(),而不是<,因此应该阅读

inline bool X_not_end(){return Xit != XSims.end();}

同样适用于Coefficients::not_end()

答案 1 :(得分:0)

看看这个:

inline void Simulate(){
    XSims.reserve(N+1);
    Xstart();

    for(int i=0;i<N; i++){
        //Build a container to insert into XSims
        Coefficients * XsimsIteration = new Coefficients(1000);
        // time points to previous vector of simulations.

        (*Xit)->it_start();

我看到你为XSims预留了一些内存。然后调用执行XSims.begin()的XStart()。您在具有零元素的向量上调用成员函数begin。那对我来说似乎是个红旗。由于您在公共领域发布了代码,我不得不批评它。看起来你正在混淆一些非常简单的操作,例如递增递减递归器。开始,结束和前进和后退的呼叫已经非常简单。你所做的就是让你的程序难以阅读。

然后,您将使用无效的迭代器来调用不存在的Coeffecients对象上的函数。只有在后来出现的for循环之后才真正将一些东西放入向量中。

在将任何元素放入XSims向量之前,正在执行以下代码行。

(*Xit)->it_start();
(*Xit)->it_next(); // why is this in the for loop?  You are iterating over an empty vector

为了将来参考,我强烈建议您发布一个可编辑的示例。在这个过程中你通常会学到很多东西,而且经常会在这样做和调试时发现自己的问题。在这种情况下,必须假设许多事情是关于您在实际可执行程序中可能做什么或不做什么。

答案 2 :(得分:0)

如果我从后面而不是从前面清除XSims,它会起作用,我想这会丢掉所有内容,包括我想保留的初始值。