shared_ptr make_shared example create c++ c++11 shared-ptr make-shared

c++ - example - ¿Puedes asignar una matriz con algo equivalente a make_shared?



c++ shared_ptr (3)

¿Necesita que la memoria asignada sea compartida? Puede usar un std::unique_ptr en std::unique_ptr lugar y el std::make_unique disponible en C ++ 14:

auto buffer = std::make_unique<char[]>(64);

Habrá una versión std::make_shared disponible en C ++ 20:

auto buffer = std::make_shared<char[]>(64);

buffer = new char[64]; buffer = std::make_shared<char>(char[64]); ???

¿Puede asignar memoria a una matriz usando make_shared<>() ?

Podría hacer: buffer = std::make_shared<char>( new char[64] );

Pero eso aún implica llamar al nuevo, es que, a mi entender, make_shared es más seguro y más eficiente.


¿Qué tal esto?

template<typename T> inline std::shared_ptr<T> MakeArray(int size) { return std::shared_ptr<T>( new T[size], []( T *p ){ delete [] p; } ); } auto buffer = new char[64]; auto buffer = MakeArray<char>(64);


El punto de make_shared es incorporar el objeto gestionado en el bloque de control del puntero compartido,

Ya que estás tratando con C ++ 11, ¿quizás usar una matriz de C ++ 11 satisfaría tus objetivos?

#include <memory> #include <array> int main() { auto buffer = std::make_shared<std::array<char, 64>>(); }

Tenga en cuenta que no puede usar un puntero compartido de la misma manera que un puntero que obtendría de new [], porque std::shared_ptr (a diferencia de std::unique_ptr , por ejemplo) no proporciona el operator[] . Tendrías que desreferenciarlo: (*buffer)[n] = ''a'';