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'';