有人可以向我解释为什么在这里执行函数 foo() 会导致 SEGFAULT 吗?当我将 D 类中的 unique_ptr 对象更改为包含 B 类对象而不是 A 时,一切正常。
class A
{
public:
virtual void function() = 0;
};
class B : public A
{
public:
void function()
{
std::cout << "works!!";
}
};
class D
{
public:
D(const std::unique_ptr<A>& arg): object(arg) {}
void foo()
{
object->function();
}
private:
const std::unique_ptr<A>& object;
};
int main()
{
std::unique_ptr<B> object = std::make_unique<B>();
D d(std::move(object));
d.foo();
}
我很好奇这背后的逻辑是什么。
您将 reference 传递给智能指针对象。一旦创建了
d
对象,该智能指针对象就会被销毁。这会给您留下无效的参考。当您尝试使用它时,您将出现未定义的行为。
而是通过指针对象按值传递,将其按值存储在对象中,然后将其移动到对象中:
class D
{
public:
D(std::unique_ptr<A> arg): object(std::move(arg)) {}
// ...
std::unique_ptr<A> object;
};