Eu tenho um grande conjunto de dados que carrega essencialmente assim:
for(int i=0;i<count; i++){
auto ptr = std::make_shared<Object>(Object());
//do stuff with ptr
}
Isso não é ótimo para o desempenho, devido à alocação de memória ser fragmentada. O que eu quero fazer é o seguinte:
std::shared_ptr<Object[]> allObjects; //this is stored elsewhere until the program ends
allObjects.reset(new Object[count]);
for(int i=0;i<count; i++){
auto ptr = std::weak_ptr<Object>(&allObjects[i]);
//do stuff with ptr
}
Infelizmente, isso não compila. Posso experimentar assim:
auto ptr = std::shared_ptr<Object>(&allObjects[i]);
Isso funciona muito bem enquanto o programa é executado, mas é claro que quando todas as cópias do ptr forem destruídas, haverá um inferno a pagar. Então, eu gostaria que ptr fosse um std::weak_ptr. O array principal std::shared_ptr será armazenado até que todos os fracos_ptr sejam destruídos. Então, posso criar um std::weak_ptr para um membro indexado de um std::shared_ptr do tipo array? Estou apenas faltando alguma sintaxe? Preciso de um tipo de contêiner diferente? Ou estou perdendo algo fundamentalmente errado com a abordagem?