Это верно? Итак, могу ли я выделить динамическую переменную вне функции?
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())
??