c++ - 共享指针管理堆栈对象
问题描述
我对以下代码感到困惑:
#include <iostream>
#include <memory>
#include <vector>
std::shared_ptr<float> test()
{
std::vector<float> vec(10);
vec[0] = 10.1;
vec[1] = 5.0;
float* p = &vec[0];
std::shared_ptr<float> p_shared(p, [](void* ptr){});
std::cout<<"Get value 0th: "<<p_shared.get()[0]<<" , 1st: "<<p_shared.get()[1]<< std::endl;
return p_shared;
}
int main()
{
std::shared_ptr<float> p1 = test();
p1.get()[1] = 9.0;
std::cout<<"Get value 0th: "<<p1.get()[0]<<" , 1st: "<<p1.get()[1]<<std::endl;
std::cout<<"End of program"<<std::endl;
}
Get value 0th: 10.1 , 1st: 5
Get value 0th: 0 , 1st: 9
End of program
我不明白为什么 shared_ptr 可以在释放后用于访问内存。这是否意味着 shared_ptr 实际上延长了 vec 的生命周期?
解决方案
推荐阅读
- javascript - 如何处理按钮单击以及如何在节点js中获取输入文本的内容
- excel-formula - 当列不相等时,将 Excel 中的一列中的链接数据与另一列匹配
- ios - Swift - 启动屏幕后游戏崩溃并且无法转换到 GameScene NSException 错误
- python - Tensorflow 2梯度给出了pow的nan结果
- c# - 尝试修复 SQL Exception: A new transaction is not allowed because there is other threads running in the session
- r - 使用文字 names_pattern 透视多个列
- android - 如何使用 CMake 在 NDK 中包含预构建的共享库?
- azure - 有两种方法可以从 azure 函数 HTTP 触发器读取所有服务总线消息
- screen-scraping - 从新闻来源自动抓取新新闻文章的最有效方法是什么?
- logging - 如何在.net核心应用程序启动时停止登录到控制台?