c++ - 从引用创建 std::shared_ptr
问题描述
我在写作时遇到了对象生命周期问题
std::ifstream input("/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf");
GFReader reader {std::shared_ptr<std::ifstream>(&input)};
当程序结束时,它遇到了一个问题,破坏了我的链中的东西,说它试图释放一个未分配的指针。
但如果我这样做
GFReader reader {std::make_shared<std::ifstream>("/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf")};
然后问题就消失了。我假设我在创建我的第一个调用序列时做错了,std::shared_ptr
但我真的不明白它是什么。有人可以清楚地解释为什么第一个调用序列失败吗?
解决方案
第一种方法旨在获取现有的堆分配资源并管理其生命周期。你传递给它一个非堆分配的资源,违反了它的规则。
第二个创建一个新的堆分配资源并立即管理它。它甚至分配与对象相邻的引用计数块,以节省对::new
.
推荐阅读
- java - 我的 JPA 存储库请求正在返回缓存,而我没有在 Spring Boot 中启用它
- python - 如何对包含多个数字的字符串进行自然排序
- batch-file - 批处理文件仅删除超过 n 天的文件
- express - 使用 express 托管 UI5 webapp
- python - 如何让精灵一一出现
- javascript - 如果附件存在,SendGrid 发送函数没有响应
- python - 如何从 Python 中重复的 Proto 字段中删除所有元素?
- azure-data-explorer - Kusto 总结 3 列或更多列
- javascript - 脚本已加载但有时未完全执行
- python - str(x) 和 x.str 有什么区别?