提问人:szj 提问时间:8/4/2023 更新时间:8/4/2023 访问量:86
传递带有派生类的unique_ptr会导致 SEGFAULT
Passing unique_ptr with derived class causes SEGFAULT
问:
有人可以向我解释为什么在这里执行函数 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();
}
我很好奇它背后的逻辑是什么。
答:
6赞
Some programmer dude
8/4/2023
#1
传递对智能指针对象的引用。此智能指针对象将在创建对象后立即被销毁。这会给你留下一个无效的引用。当您尝试使用它时,您将出现未定义的行为。d
而是按值传递指针对象,按值将其存储在对象中,然后将其移动到对象中:
class D
{
public:
D(std::unique_ptr<A> arg): object(std::move(arg)) {}
// ...
std::unique_ptr<A> object;
};
评论
A
object
const std::unique_ptr<A>& object;
/*const*/ std::unique_ptr<A> object;
/*const*/ A& object;