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.