函数(通过 std::move)返回的 unique_ptr 何时超出范围

When does a unique_ptr returned by a function (via std::move) go out of scope

我正在使用一个存储在共享内存区域中的大对象,并由 getter 编辑 return。由于对象的大小,我 运行 遇到了 return 按值计算对象导致堆栈崩溃的问题。为了避免这种情况,我决定 return a unique_ptr 到堆上对象的副本,我希望调用函数能够将其用作局部变量。请参阅下面的示例代码:

注意:我正在处理的代码库是 C++11,而不是 C++14,所以我不能使用 std::make_unique

#include <memory>
struct AbsoluteUnit {
    char bigChungus[10000000];
    int bigChungusSize;
};
AbsoluteUnit g_absUnit;

std::unique_ptr<AbsoluteUnit> getAbsoluteUnit() {
    return std::move(std::unique_ptr<AbsoluteUnit>(new AbsoluteUnit(g_absUnit)));
}

void Example1()
{
    std::unique_ptr<AbsoluteUnit> absUnitPtr = getAbsoluteUnit();
    AbsoluteUnit& absUnit = *absUnitPtr.get();
    ///
    /// Some other code
    ///
}

void Example2()
{
    AbsoluteUnit& absUnit = *getAbsoluteUnit().get();
    ///
    /// Some other code
    ///
}

我的问题是:在示例 2 中,unique_ptr 何时超出范围?

在示例 1 中,我将 unique_ptr 存储在局部变量中,因此我希望它在函数退出时超出范围。但是在 Example2 中,我没有为它创建一个局部变量,那么在该行执行之后 unique_ptr 会发生什么?它仍然在函数范围内,还是立即超出范围?

get()成员函数returns指向AbsoluteUnit对象的指针std::unique_ptr<AbsoluteUnit>getAbsoluteUnit()returns.

托管的 AbsoluteUnit 对象随后绑定到引用 absUnit:

AbsoluteUnit& absUnit = *getAbsoluteUnit().get();

但是,std::unique_ptr 在上述语句之后不复存在,因此托管的 AbsoluteUnit 对象也不复存在。因此,absUnit 变成了 悬空引用 .


如果您想避免使用指针语法,您可以这样写:

const std::unique_ptr<AbsoluteUnit> ptr = getAbsoluteUnit();
AbsoluteUnit& obj = *ptr;
// ... use obj instead of ptr

或更简洁 auto:

const auto ptr = getAbsoluteUnit();
auto& obj = *ptr;
// ... use obj instead of ptr