Это верно? Итак, могу ли я выделить динамическую переменную вне функции?
TMyClass* ClassA::myAllocFunc()
{
return new MyClass;
}
void ClassA::myFunc()
{
std::unique_ptr<MyClass> l(myAllocFunc);
}
Это не скомпилируется, так что нет, это неправильно. Можете ли вы быть немного подробнее в своем вопросе?
Ответы на ваши вопросы: Да. Нет да.
Примечание: предпочтительнее использовать std::make_unique, а не new. make_unique заполняет несколько дыр, которые могут существовать между вызовом new и unique_ptr получением права владения, что приводит к утечкам памяти.
Конструктору unique_ptr<T> нужен указатель на память, выделенную с помощью new, его не волнует (или он не знает), откуда взялся этот указатель.





Да, вы можете заставить функцию возвращать необработанный указатель и 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();
}
Мне кажется неопределенное поведение. Вы передали указатель на функцию конструктору интеллектуальных указателей. Это не имеет смысла. Может быть, вы хотите вызвать функцию типа
l(myAllocFunc())??