C++ 从引用创建std::shared_ptr

C++ 从引用创建std::shared_ptr,c++,pointers,C++,Pointers,我在编写时遇到了对象生存期问题 std::ifstream input("/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf"); GFReader reader {std::shared_ptr<std::ifstream>(&input)}; std::ifstream输入(“/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf”

我在编写时遇到了对象生存期问题

std::ifstream input("/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf");
GFReader reader {std::shared_ptr<std::ifstream>(&input)};
std::ifstream输入(“/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf”);
GFReader阅读器{std::sharedptr(&input)};
当程序结束时,它遇到了一个问题,破坏了我链中的东西,说它试图释放一个未分配的指针

但如果我这样做了

GFReader reader {std::make_shared<std::ifstream>("/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf")};
GFReader阅读器{std::make_shared(“/Users/d.a.hosek/CLionProjects/gftodvi/data/cmr10.2602gf”);

然后问题就消失了。当我创建我的
std::shared\u ptr
时,我假设我在第一次调用序列中做错了什么,但我并不真正理解它是什么。有人能给我一个清晰的解释为什么第一个调用序列失败吗?

第一种方法是获取现有的堆分配资源并管理其生存期。您向它传递了一个非堆分配的资源,违反了它的规则


第二种方法创建一个新的堆分配资源并立即对其进行管理。它甚至在对象附近分配ref counting块,以保存对
:new

的调用。作为一种解决方法,您可以传递一个
共享的\u ptr
,而无需op deletor。(如果您无法修改
GFReader
以获取非所有者指针)(并且无法动态分配
输入
,例如,它来自参数)