Sobes.tech
Middle

Aký je rozdiel medzi vytvorením objektu shared_ptr pomocou konštruktora a použitím funkcie make_shared?

sobes.tech AI

Odpoveď od AI

Rozdiel medzi vytvorením objektu pomocou konštruktora shared_ptr a funkcie make_shared spočíva v mechanizme alokácie pamäte a efektívnosti.

  • Konštruktor shared_ptr: Vyhradí pamäť pre objekt a riadiaci blok (čítače odkazov) oddelené.
    #include <memory>
    
    class MyClass {
    public:
        int value;
        MyClass(int v) : value(v) {}
    };
    
    int main() {
        // Alokácia pamäte pre MyClass a riadiaci blok prebieha oddelene
        std::shared_ptr<MyClass> ptr1(new MyClass(10));
        return 0;
    }
    
  • make_shared: Vyhradí pamäť pre objekt a riadiaci blok v jednom pamäťovom bloku.
    #include <memory>
    
    class MyClass {
    public:
        int value;
        MyClass(int v) : value(v) {}
    };
    
    int main() {
        // Vyhradí pamäť pre MyClass a riadiaci blok v jednom bloku
        std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>(20);
        return 0;
    }
    
Vlastnosť Konštruktor shared_ptr make_shared
Alokácia pamäte Objekt a riadiaci blok oddelene Objekt a riadiaci blok v jednom bloku
Počet operácií alokácie pamäte Dve Jedna
Efektívnosť Menej efektívne Efektívnejšie (menej režie)
Bezpečnosť pri výnimkách Vyžaduje opatrnosť s new T(...) Plne bezpečné
Použitie s poľami Áno (s vlastným deleterom) Nie (do C++20), áno (s C++20 pre shared_ptr<T[]>)

Použitie make_shared je preferované, ak nemáte špecifické dôvody na použitie konštruktora, pretože je efektívnejšie a bezpečnejšie z hľadiska výnimiek. Konštruktor môže byť potrebný napríklad pri vytváraní shared_ptr z už existujúceho "surového" ukazovateľa.