bad_alloc 在 std::vector 构造函数中

bad_alloc in std::vector constructor

本文关键字:vector 构造函数 std alloc bad      更新时间:2023-10-16

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只是来自size_t的typedef。我不明白为什么我定义的常量BUFCOUNT会导致构造函数内部的滚动值,并且希望有人帮助我找到我缺少的明显东西。

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

由于让每个Outer对象在其中存储相同的BUFCOUNT整数毫无意义,因此您可能希望BUFCOUNT静态。