智能指针移动语义我不清楚
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?
您正在传递一个指向已失效的堆栈内存的指针(与之关联的堆栈帧已展开,因此不再定义/保留那里的变量(。输出中涉及的函数调用正在重写它。 unique_ptr
在这里并不真正相关,但通过使用:
int* qq() {
int b = 11;
return &b;
}
并避免unique_ptr
僵化,尽管更简单的版本更有可能被编译器注意到无效。在这两种情况下,访问指向(b
的地址(的内存在函数返回的那一刻变得无效(未定义的行为(,并且在实践中,b
的值被下一个函数调用覆盖(在这种情况下,std::cout
的operator<<
重载(。
unique_ptr
用于动态分配的内存,您不能只向它传递堆栈值的地址并期望它做任何有用的事情。
相关文章:
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- C++复制 c'tor 现在确实会采取行动。 不清楚为什么
- 矢量编程:不清楚矢量的初始化
- 调用虚函数的逻辑不清楚(或者是方法隐藏?
- cudaMemcpy 在从设备读取到主机时返回 cudaErrorInvalidArgument,不清楚原因
- 实现附加对象:不清楚的文档示例
- 智能指针移动语义我不清楚
- 在 c++ 中移动 2d 数组的构造函数(语法逻辑不清楚):
- 为什么这个错误如此不清楚
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 切换语句在 C++ 中的输出不清楚
- 不清楚的副本分配操作员示例
- 我在c++应用程序上搞不清楚
- Visual Studio 2012 中的错误日志不清楚
- C++引用-有些事情我不清楚
- 解密不清楚的语法
- 使用Boost Coroutine(1.55)的不清楚分割错误
- 不清楚按位 AND 赋值的使用
- 纹理不清楚的 OpenGL 渲染
- 不清楚如何在从抽象基类派生的类中实现运算符重载