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
,这意味着它是一个实例数据成员(就像bufs1
,bufs2
等一样。非静态数据成员在类中按其声明顺序进行初始化。这意味着bufs1
和bufs2
将在BUFCOUNT
之前进行初始化。因此,bufs2
的初始化使用BUFCOUNT
的尚未统一的值(换句话说,具有未定义的行为)。
由于使每个Outer
对象在其中存储相同的BUFCOUNT
整数为零,所以您可能希望将BUFCOUNT
设为静态。