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 shared_ptrs может решить проблему, но я не уверен, как это сделать, учитывая, что bar1 и bar2 являются ссылками на foo и bar. Может ли кто-нибудь помочь мне с этим, пожалуйста?