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.