Могу ли я выделить unique_ptr вне функции?

Это верно? Итак, могу ли я выделить динамическую переменную вне функции?

TMyClass* ClassA::myAllocFunc()
{
 return new MyClass;
}

void ClassA::myFunc()
{
 std::unique_ptr<MyClass> l(myAllocFunc);
 
}

Мне кажется неопределенное поведение. Вы передали указатель на функцию конструктору интеллектуальных указателей. Это не имеет смысла. Может быть, вы хотите вызвать функцию типа l(myAllocFunc())??

digito_evo 06.08.2024 19:45

Это не скомпилируется, так что нет, это неправильно. Можете ли вы быть немного подробнее в своем вопросе?

NathanOliver 06.08.2024 19:46

Ответы на ваши вопросы: Да. Нет да.

Eljay 06.08.2024 19:58

Примечание: предпочтительнее использовать std::make_unique, а не new. make_unique заполняет несколько дыр, которые могут существовать между вызовом new и unique_ptr получением права владения, что приводит к утечкам памяти.

user4581301 06.08.2024 20:03

Конструктору unique_ptr<T> нужен указатель на память, выделенную с помощью new, его не волнует (или он не знает), откуда взялся этот указатель.

john 06.08.2024 20:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, вы можете заставить функцию возвращать необработанный указатель и std::unique_ptr взять на себя ответственность за него.

В вашем примере вам просто нужно вызвать функцию и передать ее возвращаемое значение std::unique_ptr, а не пытаться передать саму функцию, например:

std::unique_ptr<MyClass> l(myAllocFunc()); // <-- notice the extra '()'

При этом лучшим вариантом было бы myAllocFunc() возвращать std::unique_ptr для начала, а не возвращать необработанный указатель, например:

std::unique_ptr<TMyClass> ClassA::myAllocFunc()
{
    return std::make_unique<MyClass>();
}

void ClassA::myFunc()
{
    std::unique_ptr<MyClass> l = myAllocFunc();
    // or simply:
    // auto l = myAllocFunc();
}

Другие вопросы по теме

Похожие вопросы