Передача уникального указателя указателя на функцию, которая принимает двойной указатель - PullRequest
1 голос
/ 18 июня 2020

У меня есть функция, которая эффективно это делает

void foo(Class** c)
{
    // memory checks and stuff
    (*c) = new Class();
    // more stuff
}

Я не могу изменить эту функцию. Чтобы вызвать эту функцию, мне нужно сделать что-то вроде этого.

Class* c = nullptr;
foo(&c);
if (c)
{
    // stuff
}
delete c;

Я бы предпочел использовать std::unique_ptr, а не необработанный указатель. Однако я не знаю, как получить адрес внутреннего указателя. Приведенный ниже листинг, очевидно, не компилируется, потому что я пытаюсь взять адрес rvalue.

std::unique_ptr<Class> c = nullptr;
foo(&(c.get()));
if (c)
{
    // stuff
}

Я понимаю, что могу создать необработанный указатель, а также уникальный указатель, вызвать функцию, затем укажите необработанный указатель на уникальный указатель, но я бы предпочел этого не делать. Есть ли способ делать то, что я хочу?

Ответы [ 2 ]

8 голосов
/ 18 июня 2020

Создайте оболочку вокруг foo:

std::unique_ptr<Class> foo()
{
    Class* c = nullptr;
    foo(&c);
    return std::unique_ptr<Class>(c);
}
3 голосов
/ 18 июня 2020

Ваши руки связаны API функции.

Лучшее решение, которое я лично вижу, - это сделать то, о чем вы сказали, что не хотите: создать unique_ptr после вызова функции.

Если вы часто вызываете эту функцию или у вас много таких функций, я бы создал функцию-оболочку, которая локально создает необработанный указатель и возвращает unique_ptr.

...