智能指针移动语义我不清楚
smart pointer move semantics unclear to me
抱歉,标题一般,但我只能描述发生了什么。
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?
您正在传递指向已失效的堆栈内存的指针(与其关联的堆栈帧已展开,因此那里的变量不再 defined/reserved)。输出中涉及的函数调用正在重写它。 unique_ptr
在这里并不是真正相关的,你会通过使用得到相同的未定义行为:
int* qq() {
int b = 11;
return &b;
}
并避免 unique_ptr
冗长的代码,尽管更简单的版本更有可能被编译器视为无效。在这两种情况下,访问指向(b
的地址)的内存在函数 returns 的那一刻变得无效(未定义的行为),并且在实践中,b
的值被覆盖下一个函数调用(在本例中,std::cout
的 operator<<
重载)。
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?
您正在传递指向已失效的堆栈内存的指针(与其关联的堆栈帧已展开,因此那里的变量不再 defined/reserved)。输出中涉及的函数调用正在重写它。 unique_ptr
在这里并不是真正相关的,你会通过使用得到相同的未定义行为:
int* qq() {
int b = 11;
return &b;
}
并避免 unique_ptr
冗长的代码,尽管更简单的版本更有可能被编译器视为无效。在这两种情况下,访问指向(b
的地址)的内存在函数 returns 的那一刻变得无效(未定义的行为),并且在实践中,b
的值被覆盖下一个函数调用(在本例中,std::cout
的 operator<<
重载)。
unique_ptr
用于动态分配的内存,您不能只将堆栈值的地址传递给它并期望它做任何有用的事情。