Подтвердить что ты не робот

Bad_alloc в конструкторе std::vector

std::vector имеет конструктор, в котором передача одного аргумента size_type count должна определять вектор с count элементами, построенными по умолчанию. Но после неудачного преобразования следующий код завершился с ошибкой bad_alloc:

#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;
}

Когда я смотрю в отладчике, я вижу, что на этом втором векторном конструкторе произошло неправильное преобразование:

#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 - это просто typedef от size_t. Я не понимаю, почему моя определенная константа BUFCOUNT приводит к тому, что значение roll-around внутри конструктора, и было бы признательно, что кто-нибудь помог мне найти очевидную вещь, которую мне не хватает.

4b9b3361

Ответ 1

BUFCOUNT не static, что означает его член данных экземпляра (точно так же, как bufs1, bufs2 и т.д.) Нестатические члены данных инициализируются в порядке их объявления внутри класса. означает, что bufs1 и bufs2 будут инициализированы до BUFCOUNT. Инициализация bufs2 поэтому использует еще не унифицированное значение BUFCOUNT (другими словами, имеет Undefined Поведение).

Так как он имеет нулевой смысл, чтобы каждый объект Outer сохранял одно и то же число BUFCOUNT внутри него, возможно, вы захотите сделать BUFCOUNT static.