C++ 如何创建对智能指针的引用?

C++ 如何创建对智能指针的引用?,c++,smart-pointers,C++,Smart Pointers,在这里,bar有选择地是一个不需要删除的指针(foo),或者是一个使用new创建的需要删除的指针(foo2()) 我想让bar成为一个智能指针(这里可能最有意义的是shared_ptr),这样我就不必显式地处理delete,以防foo2的结果被分配给它 然而,这意味着我也使foo(并使foo2返回)成为一个共享的ptr,因为除非我这样做,否则我会得到一个 std::ofstream x; std::ostream *foo = NULL; x.open(...); foo = &x

在这里,bar有选择地是一个不需要删除的指针(
foo
),或者是一个使用new创建的需要删除的指针(
foo2()

我想让bar成为一个智能指针(这里可能最有意义的是shared_ptr),这样我就不必显式地处理delete,以防foo2的结果被分配给它

然而,这意味着我也使foo(并使foo2返回)成为一个共享的ptr,因为除非我这样做,否则我会得到一个

std::ofstream x; 
std::ostream *foo = NULL; 
x.open(...); 
foo = &x; 
std::ostream *bar = diff? foo2() : foo; //foo2 is a function returning a new std::ostream(...) and has no side effects
std::ostream &bar1 = *foo; 
std::ostream &bar2 = *bar; 
错误

free(): invalid pointer
free(): invalid pointer
乍一看,我认为让bar1和bar2共享可能会解决这个问题,但考虑到bar1和bar2是对foo和bar的引用,我不确定如何做到这一点。有人能帮我吗

条形图是一个有选择的指针,不需要删除。。。或者一个指针。。。这需要删除

我想把bar变成一个智能指针

这是一个糟糕的设计。最好使用无条件拥有或无条件不拥有的指针,而不是有条件地使用一个或另一个指针

我建议您将使用ostream的所有内容移动到单独的函数中,并简单地用一个流或另一个流调用它:

munmap_chunk(): invalid pointer
free(): invalid pointer

但是,最好是从
foo2
按值返回流,除非您有某种使用间接寻址的动态多态性原因。

请显示完整的。但是,即使这样做,我也会得到相同的错误。请向我们展示您是如何做到这一点的。您希望它知道在无法知道的情况下何时可以删除。不管你选择什么类型。@DeanSeo我更新了帖子,尝试将foo、bar和foo2()(return)设置为共享的\u ptr。@胡桃木正如eerorika在回答中所解释的,你不能有唯一的\u ptr或有条件拥有(即有时拥有,有时不拥有)的指针的共享\u ptr。对于唯一的或共享的ptr,您必须知道您是否拥有它。当你知道这一点时,你可以选择如何管理它。这两者之间没有任何区别。
munmap_chunk(): invalid pointer
free(): invalid pointer
void use_stream(std::ostream&);

if (diff) {
    auto ptr = foo2(); // some flavour of smart pointer
                       // use unique if you don't need shared
    use_stream(*ptr);
} else {
    std::ofstream foo(...);
    use_stream(foo);
}