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

时间:2017-05-11 01:59:43

标签: c++ pointers smart-pointers unique-ptr

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

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?

1 个答案:

答案 0 :(得分:5)

你正在传递一个已经失效的堆栈内存指针(与之关联的堆栈帧已经展开,因此不再定义/保留变量)。输出中涉及的函数调用正在重写它。 unique_ptr在这里并不重要,您可以通过以下方式获得相同的未定义行为:

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

并避免unique_ptr严重,尽管更简单的版本更可能被编译器注意为无效。在这两种情况下,访问指向(b的地址)的内存在函数返回时变为无效(未定义的行为),并且在实践中,b的值被覆盖下一个函数调用(在这种情况下,是operator<<的{​​{1}}重载。)

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