bad_alloc 在 std::vector 构造函数中
bad_alloc in std::vector constructor
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
,这意味着它是一个实例数据成员(就像bufs1
、bufs2
等一样。 非静态数据成员按照它们在类中的声明顺序进行初始化。这意味着bufs1
和bufs2
将在BUFCOUNT
之前初始化。因此,bufs2
的初始化使用尚未单位化的BUFCOUNT
值(换句话说,具有未定义的行为(。
由于让每个Outer
对象在其中存储相同的BUFCOUNT
整数毫无意义,因此您可能希望BUFCOUNT
静态。
相关文章:
- 编译器如何区分std::vector的构造函数
- 为什么std::vector和std::valarray初始化构造函数不同
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- push_back std::vector,则重复调用复制构造函数
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 双重调用传递给 std::vector::emplace_back 的类的复制构造函数
- std::vector 是否有用于引用的复制构造函数?
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- std::vector 范围构造函数可以调用显式转换吗?
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- bad_alloc 在 std::vector 构造函数中
- 这个 std::vector 构造函数中发生了什么
- 如何使用<vector>构造函数
- 将临时右值绑定到 std::vector 构造函数中的引用左值
- Vector构造函数/析构函数调用
- Clang:如何启用ext_vector_type的vector构造函数
- vector构造函数——为什么是int而不是int*