如何将循环中的局部变量的引用赋值给循环外的vector 20C

急!!!!C++ 新手,在写作业时遇到如下问题,希望大神可以帮忙看看,谢谢了!!!

  • vector< pair > pillarSmiles;
    vector kmin, kmax;
    vector< pair > marks;
    ArbitrageFreeInterpolator af;

    int a = 0;
    while(!fin.eof()) {
    double t;
    double atmvol;
    double ms25;
    double rr25;
    double ms10;
    double rr10;
    if (fin >> t >> atmvol >> ms25 >> rr25 >> ms10 >> rr10) {
    cout << t << "\t" << atmvol << "\t" << ms25 << "\t" << rr25 << "\t" << ms10 << "\t" << rr10 << std::endl;
    marks = input2Marks(spot, rd, rf, t, atmvol, ms25, rr25, ms10, rr10);
    af = ArbitrageFreeInterpolator(t, marks, spot, mu);
    pillarSmiles.push_back( pair(t, af) );
    std::cout<< "pillarSmiles[" << a <<"].second.Vol(1.3)= "< kmin.push_back(marks.front().first); // for plotting the charts only
    kmax.push_back(marks.back().first);
    }
    a++;
    }
    ImpliedVol iv(pillarSmiles);
    ImpliedVol,Smile都是自定义的类,AbitrageFreeInterpolator是Smile的子类,声明如下:
    class ArbitrageFreeInterpolator : public Smile
    {
    public:
    ArbitrageFreeInterpolator();
    ArbitrageFreeInterpolator(double _t, const vector& _marks, double _S, double _mu);
    virtual double Vol(double strike) const;
    private:
    vector< pair > marks; //M (k, sigma) input pairs;
    double S; // Spot price;
    double mu; // drift of spot;
    double t; //time to maturity(in unit of year);
    vector< pair > outputmarks; // N (k, c)pairs;
    vector y2; // second derivatives;
    };
    Input文件内容如下:
    1.25805 0.0100 0.0030
    0.02 0.1550 0.0016 -0.0065 0.0050 -0.0111
    0.04 0.1395 0.0016 -0.0110 0.0050 -0.0187
    0.06 0.1304 0.0021 -0.0143 0.0067 -0.0248
    ......
    然后我发现pillarSmile中存储的都是最后一次af的值,也就是每次重新给af赋值时,都会改变pillarSmile中以前输入的值,另外我也尝试过在循环外建一个AbitrageFreeInterpolator的vector,然后每次将循环内新定义的AbitrageFreeInterpolator赋值给这个vector,
    结果会报错:Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
    想知道各位有什么好的解决办法吗?
    更新,采用一楼的建议,循环中改成了: ArbitrageFreeInterpolator* af = new ArbitrageFreeInterpolator(t, marks, spot, mu); pillarSmiles.push_back( pair(t, *af) ); delete af; cout出来的结果就不一样了,但是出现了一个新的问题,就是每次到pillaSmile最后几组的时候,出来的结果总是很大的异常值,有时候会中断,提示Thread 1:EXC_BAD_ACCESS(code=1,address=0x70) , 我查了下好像是访问已释放信息导致的,不太懂,想问下有什么解决的办法?

2个回答

请在for循环中用new AbitrageFreeInterpolator,然后将结果添加到链表中。
出现问题的原因是,ArbitrageFreeInterpolator af是在循环外定义的变量,添加到链表中的是这个变量af,循环n次,就是添加这个变量af到链表中n次,每次都是同一个变量,那链表中肯定是n个相同的值,且都是最后一次修改的值。

qq_39971112
sherry_gong 回复u014378771: 您好,非常感谢您的回复!我按照您的建议,循环中改成了: ArbitrageFreeInterpolator* af = new ArbitrageFreeInterpolator(t, marks, spot, mu); pillarSmiles.push_back( pair<double, Smile&>(t, *af) ); delete af; cout出来的结果就不一样了,但是出现了一个新的问题,就是每次到pillaSmile最后几组的时候,出来的结果总是很大的异常值,有时候会中断,提示Thread 1:EXC_BAD_ACCESS(code=1,address=0x70) , 我查了下好像是访问已释放信息导致的,不太懂,想问下有什么解决的办法吗?
接近 2 年之前 回复
qq_39971112
sherry_gong 您好,非常感谢您的回复!我按照您的建议,循环中改成了: ArbitrageFreeInterpolator* af = new ArbitrageFreeInterpolator(t, marks, spot, mu); pillarSmiles.push_back( pair<double, Smile&>(t, *af) ); delete af; cout出来的结果就不一样了,但是出现了一个新的问题,就是每次到pillaSmile最后几组的时候,出来的结果总是很大的异常值,有时候会中断,提示Thread 1:EXC_BAD_ACCESS(code=1,address=0x70) , 我查了下好像是访问已释放信息导致的,不太懂,想问下有什么解决的办法吗?
接近 2 年之前 回复
u014378771
kinghero123456 #include <iostream> #include <vector> using namespace std; class test { public: test(int h):_h(h) { } test() { } int GetH() { return _h; } private : int _h; }; int _tmain(int argc, _TCHAR* argv[]) { vector<test> h1; test h2; for(int i = 0 ; i < 2; ++i) { h2 = test(i); h1.push_back(h2); } for(size_t i = 0 ; i < h1.size(); ++i) { cout<<h1[i].GetH()<<endl; } system("pause"); return 0; } //我写的这个例子是可以的,这位同学的问题是不是不准确呀?
接近 2 年之前 回复

for循环中new了之后 不要delete,delete你释放指针了,等于白存到链表了,链表中的指针指向不确定的位置了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问