Sobes.tech
Middle
286

Qual é a diferença entre criar um objeto shared_ptr através do construtor e usar a função make_shared?

Resposta da IA

sobes.tech IA

A diferença entre criar um objeto através do construtor shared_ptr e a função make_shared reside no mecanismo de alocação de memória e na eficiência.

  • Construtor shared_ptr: Aloca memória para o objeto e o bloco de controle (contadores de referências) separadamente.
    #include <memory>
    
    class MyClass {
    public:
        int value;
        MyClass(int v) : value(v) {}
    };
    
    int main() {
        // A alocação de memória para MyClass e o bloco de controle ocorre separadamente
        std::shared_ptr<MyClass> ptr1(new MyClass(10));
        return 0;
    }
    
  • make_shared: Aloca memória para o objeto e o bloco de controle em um único bloco de memória.
    #include <memory>
    
    class MyClass {
    public:
        int value;
        MyClass(int v) : value(v) {}
    };
    
    int main() {
        // A alocação de memória para MyClass e o bloco de controle ocorre em um único bloco
        std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>(20);
        return 0;
    }
    
Característica Construtor shared_ptr make_shared
Alocação de memória Objeto e bloco de controle separados Objeto e bloco de controle em um único bloco
Número de operações de alocação de memória Duas Uma
Eficiência Menos eficiente Mais eficiente (menos overhead)
Segurança em exceções Requer cautela na expressão new T(...) Totalmente seguro
Uso com arrays Sim (com deleter personalizado) Não (até C++20), sim (com C++20 para shared_ptr<T[]>)

O uso de make_shared é preferível se não houver razões específicas para usar o construtor, pois é mais eficiente e seguro do ponto de vista de exceções. O construtor pode ser necessário, por exemplo, ao criar um shared_ptr a partir de um ponteiro "cru" já existente.