首页 > 解决方案 > 从引用创建 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但我真的不明白它是什么。有人可以清楚地解释为什么第一个调用序列失败吗?

标签: c++pointers

解决方案


第一种方法旨在获取现有的堆分配资源并管理其生命周期。你传递给它一个非堆分配的资源,违反了它的规则。

第二个创建一个新的堆分配资源并立即管理它。它甚至分配与对象相邻的引用计数块,以节省对::new.


推荐阅读