verificar usar qué pueden para métodos libreria hay elementos contenedor clase c++ pointers stl memory-address

usar - clase stl c++



Punteros a elementos de contenedores STL (4)

Dado un contenedor STL (también puede tener en cuenta boost::multi_index_container y boost::multi_index_container ) que no es contiguo, se garantiza que las direcciones de memoria de los elementos dentro del contenedor nunca cambian si no se elimina ningún elemento, (pero se pueden agregar nuevos)?

p.ej

class ABC { }; // //... // std::list<ABC> abclist; ABC abc; abclist.insert(abc); ABC * abc_ptr = &(*abclist.begin());

En otras palabras, abc_ptr será apuntado a abc durante la ejecución, si no abc_list abc de abc_list .

Estoy preguntando esto porque voy a envolver la clase ABC en C ++ / Cli, así que necesito punteros a las instancias ABC en la clase contenedora. ABC es una clase simple y quiero que el contenedor maneje la memoria. Si la respuesta es no, std::list<ABC*> .



Creo que es mejor usar std::list <shared_ptr <ABC> > lugar de pasar un puntero. Es una buena práctica delegar la administración de la memoria (consulte scott meyers eficaz c ++)

Esto tiene múltiples ventajas:

  • Puedes compartirlos y pasarlos sin el dolor de cabeza de liberarlos.
  • recolección de basura de sus punteros
  • no pasas un puntero en primer lugar

El estándar de C ++ coloca reglas estrictas sobre la validez de las referencias / iteradores. Para cada contenedor, cada método documenta qué elementos se pueden mover (invalidando referencias e iteradores).

Los contenedores basados ​​en nodos: list , map , set , multimap y multiset garantizan que las referencias y los iteradores a los elementos seguirán siendo válidos siempre que el elemento no se elimine del contenedor.

Su caso de uso es, por lo tanto, uno de los casos en los que usar una list para el almacenamiento es bueno, ya que la invalidación garantiza la oferta de la lista.


std::list , std::set y std::map garantizan que los iteradores (incluidos los punteros simples) no se invalidarán cuando se agregue o incluso se elimine un nuevo elemento.