read from delete data acceder c++ vector primitive-types

from - vector c++



std:: vector<int>:: claro, ¿tiempo constante? (2)

Posible duplicado:
¿Cuál es la complejidad de std :: vector <T> :: clear () cuando T es un tipo primitivo?

Si tengo un std::vector con un tipo primitivo, y llamo clear() (de esta manera push_back comienza al comienzo de la capacity ), ¿la llamada clear() se completará en tiempo constante o tiempo lineal? La documentación dice que destruye todos los elementos, pero si el elemento es un int, no debería haber nada que destruir, ¿no?

editar: Encontré un duplicado que tiene un póster que explica en detalle que la implementación puede verificar si el destructor es trivial, y da un ejemplo de un compilador que tiene esa verificación (GCC).

¿Cuál es la complejidad de std :: vector <T> :: clear () cuando T es un tipo primitivo?


Depende de cómo se implemente el vector, pero un conjunto de objetos con destructores triviales (que incluye POD como tipos integrales integrados como int ) debería poder desasignarse de forma segura con una única llamada al vector<T>::allocator_type::deallocate sin hacer bucles sobre los elementos e invocar destructores de forma individual. Una implementación de std::vector puede usar type_traits o compiladores internos para determinar si T tiene un destructor trivial, y desasignar la matriz interna en consecuencia. Necesitará verificar el código fuente de su implementación para averiguar qué hace, pero la mayoría de las implementaciones std::vector de std::vector le dará la asignación de tiempo constante para tipos con destructores triviales (o al menos tiempo constante para tipos integrales y otros POD).


El estándar no garantiza la complejidad de std::vector::clear , aunque se espera que la operación sea lineal en el tamaño del contenedor para tipos de elementos complejos y constante para los POD.