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

-1 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;
}
Run Code Online (Sandbox Code Playgroud)

输出

11
32767 // why not 11?
Run Code Online (Sandbox Code Playgroud)

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

11
0 // why not 11?
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 5

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

int* qq() {
    int b = 11;
    return &b;
}
Run Code Online (Sandbox Code Playgroud)

unique_ptr虽然更简单的版本更容易被编译器注意为无效,但是避免了严重的问题.在这两种情况下,b当函数返回时,访问指向(的地址)的内存变为无效(未定义的行为),并且在实践中,b下一个函数调用将覆盖该值(在这种情况下,operator<<重载为std::cout) .

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