Используйте RAII с фабрикой, принимая в качестве входных данных ссылку на указатель

У меня есть функция, которая создает объект и принимает в качестве входных данных ссылку на указатель:

void generator(Object*&)

и я называю это так:

Object* obj = nullptr;
generator(obj);

...
use obj
...
delete obj;

Как видите, пользователь несет ответственность за уничтожение obj. Есть ли лучший способ использовать интеллектуальные указатели или другое решение, чтобы избежать ручного управления памятью?

Я не могу изменить функцию generator.


person Ruggero Turra    schedule 21.01.2015    source источник
comment
Просто напишите обертку вокруг generator. Назовите это generator()   -  person sbabbi    schedule 21.01.2015


Ответы (1)


Даже если вы не можете изменить generator :(, вы все равно можете использовать интеллектуальный указатель:

Object* obj = nullptr;
generator(obj);
std::unique_ptr<Object> raii_obj(obj);
...
use obj/raii_obj
...
// auto delete raii_obj.

И вы даже можете обернуть его функцией:

std::unique_ptr<Object> make_object()
{
    Object* obj = nullptr;
    generator(obj);
    return std::unique_ptr<Object>(obj);
}
person Jarod42    schedule 21.01.2015
comment
есть ли способ сделать то же самое, не объявляя необработанный указатель и не используя непосредственно интеллектуальный указатель с функцией? - person Ruggero Turra; 21.01.2015
comment
Нет, вы не можете напрямую изменять внутренний указатель std::unique_ptr. - person Jarod42; 21.01.2015