智能指针移动语义我不清楚

smart pointer move semantics unclear to me

本文关键字:不清楚 语义 移动 指针 智能      更新时间:2023-10-16

很抱歉通用标题,但我只能描述正在发生的事情。

std::unique_ptr<int> qq() {
    int b = 11;
    std::unique_ptr<int> f(&b);
    return f;
}
int main() {
    std::unique_ptr<int> q = qq();
    int *p = q.release();
    *p = 11;
    std::cout << *p << "n";
    std::cout << *p << "n";
    return 0;
}

输出

11
32767 // why not 11?

返回 return std::move(f) 结果的输出

11
0 // why not 11?

您正在传递一个指向已失效的堆栈内存的指针(与之关联的堆栈帧已展开,因此不再定义/保留那里的变量(。输出中涉及的函数调用正在重写它。 unique_ptr在这里并不真正相关,但通过使用:

int* qq() {
    int b = 11;
    return &b;
}

并避免unique_ptr僵化,尽管更简单的版本更有可能被编译器注意到无效。在这两种情况下,访问指向(b的地址(的内存在函数返回的那一刻变得无效(未定义的行为(,并且在实践中,b的值被下一个函数调用覆盖(在这种情况下,std::coutoperator<<重载(。

unique_ptr用于动态分配的内存,您不能只向它传递堆栈值的地址并期望它做任何有用的事情。