vector成员变量是否可以未初始化(内存错误)

Can a std::vector member variable be uninitialized (memory error)?

本文关键字:初始化 内存 错误 成员 变量 是否 vector      更新时间:2023-10-16

这是一个较大的模拟工具的源代码摘录:

struct Foo {
  std::vector<int> v;
}
...
Foo* foo;
...
foo->v.resize(0);

Valgrind报告resize(0)所在行的Conditional jump or move depends on uninitialised value(s)。我唯一的解释是,不知怎的,为Foo类分配了内存,但从未初始化,因此v的(默认)构造函数从未被调用(注意Foo不提供用户声明的构造函数)。

谁能告诉我,如果这实际上可能是这种情况(分配,但没有初始化),为什么/如何?如果我的解释错了,你还有别的想法吗?我试着搜索SO相关的问题,但找不到答案:-/

注::我使用的是启用c++ 11的Valgrind 3.9.0和GCC 4.8.2。完整的Valgrind消息:

==967== Conditional jump or move depends on uninitialised value(s)
==967==    at 0x939751: std::vector<double, std::allocator<double> >::resize(unsigned long) (stl_vector.h:666)
...

Foo* foo;不构造对象Foo。它只初始化指向Foo对象的指针的内存。

如果您这样做,您将不会得到错误消息:

Foo foo;
foo.v.resize(10);

或:

Foo* foo = new Foo();
foo->v.resize(10);

如果你真的不想分配你必须管理的内存,你也可以使用智能指针:

std::unique_ptr<Foo> foo(new Foo());
foo->v.resize(10);

这是未定义的行为。结果是一切都是依赖的。你的程序可以正常执行,或者在相同的平台,相同的编译器上得到一个segfault。因此,为了避免这种情况,总是在使用之前初始化指针。在本例中:

Foo* ptr = new Foo();
ptr->v.resize( 0 );