shared_ptrs的矢量表现得很神秘

时间:2014-03-03 14:37:22

标签: c++ pointers inheritance vector shared-ptr

我创建了Baseshared_ptr s的向量来保存Derivedshared_ptr,并遇到一些问题。

以下简化示例显示了会发生什么。

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class Base {
public:
    Base(int i) : val(i) {}
    int val;
};

class Derived : public Base {
  public:
    Derived(int i) : Base(i) {}  
};

int main()
{
    vector<shared_ptr<Base>> vec1{
        make_shared<Base>(5),
        make_shared<Base>(99),
        make_shared<Base>(18)};

    for (auto const e : vec1)
        cout << e->val << endl;
    cout << endl;

    vector<shared_ptr<Derived>> vec2{
        make_shared<Derived>(5),
        make_shared<Derived>(99),
        make_shared<Derived>(18)};

    for (auto const e : vec2)
        cout << e->val << endl;
    cout << endl;

    vector<shared_ptr<Base>> vec3{
        make_shared<Derived>(5),
        make_shared<Derived>(99),
        make_shared<Derived>(18)};

    for (auto const e : vec3)
        cout << e->val << endl;
    cout << endl;

    return 0;
}

当我在我的机器上运行它(带有MS VS2013的Win7 64位)时,我得到以下输出:

5
99
18

5
99
18

-572662307
99
18

我在这里缺少什么?

谢谢。

1 个答案:

答案 0 :(得分:6)

在这里验证它,第一个元素被破坏了。 original bug report is here

在某些情况下使用初始化列表初始化向量时似乎会发生这种情况。 他们的回答是The fix should show up in the **future release** of Visual C++.