std::vector具有一个构造函数,其中传递size_type count的单个参数时应使用count默认构造的元素确定 vector 的大小。但是以下代码在错误的转换后失败,并带有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;
}

当我查看调试器时,可以看到在第二个 vector 构造函数上发生了错误的转换:
#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只是size_t的typedef。我不明白为什么我定义的常量BUFCOUNT会在构造函数中导致该折旧值,并且会感谢有人帮助我找到我所缺少的显而易见的东西。

最佳答案

BUFCOUNT不是static,这意味着它是一个实例数据成员(就像bufs1bufs2等一样。非静态数据成员在类中按其声明顺序进行初始化。这意味着bufs1bufs2将在BUFCOUNT之前进行初始化。因此,bufs2的初始化使用BUFCOUNT的尚未统一的值(换句话说,具有未定义的行为)。

由于使每个Outer对象在其中存储相同的BUFCOUNT整数为零,所以您可能希望将BUFCOUNT设为静态。

08-17 05:21