new example espaƱol ejemplo array c++ vector stl

c++ - example - bad_alloc en std:: constructor vectorial



vector insert c++ (1)

BUFCOUNT no es static , lo que significa que es un miembro de datos de instancia (al igual que bufs1 , bufs2 , etc. Los miembros de datos no estáticos se inicializan en el orden de su declaración dentro de la clase. Esto significa que bufs1 y bufs2 se inicializarán antes de BUFCOUNT . La inicialización de bufs2 utiliza, por bufs2 tanto, el valor aún no unificado de BUFCOUNT (en otras palabras, tiene un comportamiento no definido).

Como no tiene sentido que cada objeto Outer almacene el mismo entero BUFCOUNT dentro de él, es posible que desee que BUFCOUNT estático.

std::vector tiene un constructor donde al pasar un solo argumento de size_type count debe dimensionar el vector con el count de los elementos construidos por defecto. Pero el siguiente código falla con una excepción bad_alloc después de una mala conversión:

#include <vector> struct Inner { int foo; char buf[256]; }; template <typename Type> struct Outer { typedef std::vector<Inner> BufContainer; typedef typename BufContainer::size_type BufIndex; BufContainer bufs1; BufContainer bufs2; const BufIndex BUFCOUNT = 32; Outer() : bufs1(32), // fine bufs2(BUFCOUNT) // bad_alloc { } }; int main() { Outer<int> outer; }

Cuando miro en el depurador, puedo ver que se ha producido una conversión incorrecta en el segundo constructor vectorial:

#13 0x0000000000400bf1 in Outer<int>::Outer (this=0x7ffdc59570c0) at wtf.cc:22 22 bufs2(BUFCOUNT) (gdb) down #12 0x0000000000400d6e in std::vector<Inner, std::allocator<Inner> >::vector (this=0x7ffdc59570d8, __n=140727918359008, __a=...) at /usr/local/gcc-4.9.1/include/c++/4.9.1/bits/stl_vector.h:278 278 : _Base(__n, __a) (gdb) list 273 * This constructor fills the %vector with @a __n default 274 * constructed elements. 275 */ 276 explicit 277 vector(size_type __n, const allocator_type& __a = allocator_type()) 278 : _Base(__n, __a) 279 { _M_default_initialize(__n); } (gdb) print __n $1 = 140727918359008

std::vector::size_type es simplemente un typedef de size_t . No entiendo por qué mi BUFCOUNT constante definido BUFCOUNT resultado ese valor BUFCOUNT dentro del constructor, y agradecería a cualquiera que me ayude a encontrar lo obvio que me falta.