gpt4 book ai didi

c++ - 无法在 C++ 中使用 unique_ptr 返回派生类型

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:52 24 4
gpt4 key购买 nike

我遇到了一个奇怪的错误。当我尝试在返回指向基类型的唯一指针的函数中返回指向派生类型的唯一指针时,就好像返回值被降级为基类型一样。我无法访问它的任何方法或成员,如果我尝试访问,程序会出现段错误。

如果我尝试将 e1 重新分配给返回类型并调用其“eval”方法,则下面的示例会出现段错误。奇怪的是,在返回之前调用 eval 方法可以正常工作。当我使用分配的变量作为函数的参数之一时,似乎会发生这种情况,因为创建一个新对象来存储返回类型确实有效。

不幸的是,我的算法需要这样一行:

e1 = create( *e1, *e2 );

完整代码见下:

#include <memory>
#include <iostream>

class expr
{
public:
virtual int eval() = 0;
virtual ~expr() = default;
};

class add_expr : public expr
{
expr& e1;
expr& e2;
public:
add_expr( expr& e1, expr& e2 ): e1(e1), e2(e2) {}
int eval(){ return e1.eval() + e2.eval(); }
};

class int_expr : public expr
{
int value;
public:
int_expr( int value ) : value(value) {}
int eval(){ return value; }
};

std::unique_ptr<expr> create( expr& ast1, expr& ast2 );

int main()
{
auto e1 = std::unique_ptr<expr>( new int_expr( 10 ) );
auto e2 = std::unique_ptr<expr>( new int_expr( 10 ) );
e1 = create( *e1, *e2 );

// this seg faults
std::cout << e1->eval() << '\n';

// this works properly
auto e3 = create( *e1, *e2 );
e3->eval();
return 0;
}

std::unique_ptr<expr> create( expr& ast1, expr& ast2 )
{
auto r = std::unique_ptr<expr>( new add_expr( ast1, ast2 ) );

// this works properly
std::cout << r->eval() << '\n';
return r;
}

注意:我知道这个例子很荒谬,它只是一个非常大的程序的合并形式。

最佳答案

在这一行中:

e1 = create( *e1, *e2 );

您重新分配 e1。这意味着 e1 过去指向的东西(一个 int_expr)被删除了(因为它是一个 unique_ptr)。

现在 e1 指向的新事物(add_expr)仍然持有对刚刚被删除的 int_expr 的引用。当它尝试使用对已删除对象的引用时,它会遇到未定义的行为,在您的情况下会遇到段错误。

关于c++ - 无法在 C++ 中使用 unique_ptr 返回派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43485102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com