【发布时间】:2020-01-09 04:37:16
【问题描述】:
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;
这里,bar 选择性地是不需要删除的指针 (foo) 或使用 new 创建的需要删除的指针 (foo2())。
我想让 bar 成为一个智能指针(可能 shared_ptr 在这里最有意义)所以我不必显式处理删除,以防 foo2 的结果被分配给它。
但这意味着我也将 foo(并使 foo2 返回)设为 shared_ptr,因为除非我这样做,否则我会得到一个
free(): invalid pointer
free(): invalid pointer
错误。
std::shared_ptr<std::ostream> foo2(..) {
...
std::shared_ptr<std::ostream> ptr(new std::ofstream(...));
return ptr;
}
...
std::ofstream x;
std::shared_ptr<std::ostream> foo(nullptr);
x.open(...);
foo.reset(&x);
std::shared_ptr<std::ostream> bar(diff? foo2() : foo);
std::ostream &bar1 = *foo;
std::ostream &bar2 = *bar;
现在,我收到了这个错误 -
munmap_chunk(): invalid pointer
free(): invalid pointer
乍一看,我认为让 bar1 和 bar2 共享_ptrs 可能会解决问题,但考虑到 bar1 和 bar2 是对 foo 和 bar 的引用,我不确定如何做到这一点。有人可以帮我解决这个问题吗?
【问题讨论】:
-
请出示完整的minimal reproducible example。
-
“但是,即使在这样做之后,我也会遇到同样的错误。” 请告诉我们你是如何做到的。
-
你希望它在它无法知道的情况下以某种方式知道它何时可以删除。不管你选择什么类型。
-
@DeanSeo 我更新了帖子,尝试将 foo、bar 和 foo2()(返回)一个 shared_ptr。
-
@walnut 正如 eerorika 在回答中所解释的那样,您不能拥有一个 unique_ptr 或 shared_ptr 的有条件拥有的指针(即有时拥有,有时不拥有)。对于 unique_ptr 或 shared_ptr 你必须知道你是否拥有它。然后,当您知道这一点时,您可以选择如何管理它。中间没有。
标签: c++ smart-pointers