Считается ли плохой практикой использование необработанного указателя в конструкторе с целью немедленного оборачивания его в интеллектуальный указатель? - PullRequest
0 голосов
/ 19 апреля 2020

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


#include <memory>

using namespace std;

class A {
private:
    std::unique_ptr<int> num;

public:
    explicit A(int* n){
        num = std::make_unique<int>(*n);
    }
};

int main(){
    int n = 4;
    A a(&n); 
    // A a(std::make_unique<A>(n)); // instead of having to do this, which is a moderately irritating 

};

1 Ответ

2 голосов
/ 19 апреля 2020

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

class A {
private:
    std::unique_ptr<int> num;

public:
    explicit A(int n) : num(std::make_unique<int>(n)) {}
};
...