Com base no que é considerado idiomático no C ++ 11:
- deve um iterador em um contêiner personalizado sobreviver ao próprio contêiner sendo destruído?
- deve ser possível detectar quando um iterador é invalidado?
- as condições acima estão condicionadas a "compilações de depuração" na prática?
Detalhes : Recentemente, estive atualizando meu C ++ e aprendendo a usar o C ++ 11. Como parte disso, escrevi um invólucro idiomático em torno da biblioteca do uriparser . Parte disso é agrupar a representação da lista vinculada dos componentes do caminho analisado. Estou procurando conselhos sobre o que é idiomático para contêineres.
Uma coisa que me preocupa, vindo mais recentemente de linguagens coletadas de lixo, é garantir que objetos aleatórios não desapareçam apenas nos usuários se cometerem um erro em relação à vida útil. Para explicar isso, o PathList
contêiner e seus iteradores mantêm um shared_ptr
objeto de estado interno real. Isso garante que, desde que exista algo que aponte para esses dados, o mesmo ocorre com os dados.
No entanto, olhando para o STL (e muita pesquisa), não parece que os contêineres C ++ garantam isso. Eu tenho essa horrível suspeita de que a expectativa é apenas permitir que os contêineres sejam destruídos, invalidando quaisquer iteradores junto com ele. std::vector
certamente parece permitir que os iteradores sejam invalidados e ainda (incorretamente) funcionem.
O que eu quero saber é: o que é esperado do código C ++ 11 "bom" / idiomático? Dadas as novas dicas inteligentes e brilhantes, parece meio estranho que o STL permita que você desanime facilmente ao vazar acidentalmente um iterador. Está usando shared_ptr
para os dados de backup uma ineficiência desnecessária, uma boa idéia para depuração ou algo esperado que o STL simplesmente não faz?
(Espero que o aterramento em "C ++ 11 idiomático" evite cobranças de subjetividade ...)