Apenas uma pequena consulta sobre shared_ptr
.
É uma boa prática usar shared_ptr
apontar para uma matriz? Por exemplo,
shared_ptr<int> sp(new int[10]);
Se não, então por que não? Uma razão pela qual eu já estou ciente é que não é possível aumentar / diminuir o shared_ptr
. Portanto, ele não pode ser usado como um ponteiro normal para uma matriz.
c++
c++11
shared-ptr
tshah06
fonte
fonte
std::vector
. Você precisaria ter cuidado para passar a matriz usando referências para não fazer cópias dela. A sintaxe para acessar dados é mais limpa que shared_ptr, e redimensioná-la é muito, muito fácil. E você obtém toda a bondade do STL, se quiser.std::array
. É quase o mesmo que uma matriz bruta, mas com semântica adequada para uso na maioria dos componentes da biblioteca. Especialmente objetos desse tipo são destruídos comdelete
, nãodelete[]
. Evector
, diferentemente , ele armazena os dados diretamente no objeto, para que você não obtenha alocação extra.Respostas:
Com o C ++ 17 ,
shared_ptr
pode ser usado para gerenciar uma matriz alocada dinamicamente. Oshared_ptr
argumento do modelo neste caso deve serT[N]
ouT[]
. Então você pode escreverNo n4659, [util.smartptr.shared.const]
Para suportar isso, o tipo de membro
element_type
agora é definido comoElementos da matriz podem ser acessados usando
operator[]
Antes do C ++ 17 , não
shared_ptr
podia ser usado para gerenciar matrizes alocadas dinamicamente. Por padrão, chamará o objeto gerenciado quando não houver mais referências a ele. No entanto, quando você aloca usando, precisa chamar , e não , para liberar o recurso.shared_ptr
delete
new[]
delete[]
delete
Para usar corretamente
shared_ptr
com uma matriz, você deve fornecer um deleter personalizado.Crie o shared_ptr da seguinte maneira:
Agora
shared_ptr
chamará corretamentedelete[]
ao destruir o objeto gerenciado.O deleter personalizado acima pode ser substituído por
a
std::default_delete
especialização parcial para tipos de matrizuma expressão lambda
Além disso, a menos que você realmente precise compartilhar a participação do objeto gerenciado, a
unique_ptr
é mais adequado para esta tarefa, pois possui uma especialização parcial para os tipos de matriz.Alterações introduzidas pelas extensões C ++ para fundamentos de biblioteca
Outra alternativa pré-C ++ 17 às listadas acima foi fornecida pela Especificação Técnica dos Fundamentos da Biblioteca , que foi aprimorada
shared_ptr
para permitir que ela funcione imediatamente para os casos em que possui uma matriz de objetos. O rascunho atual dasshared_ptr
alterações previstas para este TS pode ser encontrado na N4082 . Essas alterações serão acessíveis através dostd::experimental
namespace e incluídas no<experimental/memory>
cabeçalho. Algumas das alterações relevantes para dar suporteshared_ptr
a matrizes são:- A definição do tipo de membro é
element_type
alterada- Membro
operator[]
está sendo adicionado- Diferentemente da
unique_ptr
especialização parcial para matrizes, ambosshared_ptr<T[]>
eshared_ptr<T[N]>
serão válidos e ambos resultarão nadelete[]
chamada na matriz gerenciada de objetos.fonte
shared-array
.shared_ptr::get
retorna um ponteiro para o objeto gerenciado. Para que você possa usá-lo comosp.get()[0] = 1; ... sp.get()[9] = 10;
std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );
consulte também en.cppreference.com/w/cpp/memory/default_deletestd::shared_ptr<std::array<int,N>>
deve ser o suficiente.unique_ptr
obtém essa especialização parcial, masshared_ptr
não obtém ?Uma alternativa possivelmente mais fácil que você possa usar é
shared_ptr<vector<int>>
.fonte
shared_ptr<array<int, 6>>
.