【发布时间】:2016-12-31 15:27:02
【问题描述】:
我有经典的(可能有问题的)多重继承菱形方案。
- B 继承 A
- C 继承 A
- D 继承 C 和 B
我想要一个std::vector,它可以包含C 或D
对象,所以我将其设为std::vector<C>,这是D 的爸爸和它
工作正常。
但是当我使用:std::vector<std::unique_ptr<C>> 时,我会在向量被破坏时出现分段错误。
** glibc detected *** ./a.out: free(): invalid pointer: 0x0000000009948018***
为什么会有差异?对我来说,即使是第一个实现也是有问题的。
代码
#include <string>
#include <vector>
#include <memory>
class A
{
public:
A() = default;
};
class B : public virtual A
{
public:
B() = default;
};
class C : public virtual A
{
public:
C() = default;
};
class D : public B, public C
{
public:
D() = default;
};
int main()
{
{ // this crashes
std::vector<std::unique_ptr<C>> v;
std::unique_ptr<D> s1(new D());
v.push_back(std::move(s1));
std::unique_ptr<C> s2(new C());
v.push_back(std::move(s2));
}
{ // this is fine
std::vector<C> v;
D s1;
v.push_back(s1);
C s2;
v.push_back(s2);
}
return 0;
};
【问题讨论】:
-
"我想要一个
std::vector,它可以包含C或D对象,所以我将其设为std::vector<C>" 乍一看这似乎可行,但我不知道'认为它不会按您期望的方式工作。
标签: c++ c++11 inheritance vector unique-ptr