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

时间:2014-07-08 13:29:23

标签: c++ memory c++11 valgrind

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

struct Foo {
  std::vector<int> v;
}

...

Foo* foo;

...

foo->v.resize(0);

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

有人能告诉我这是否真的是这样(分配但未初始化)以及为什么/如何?如果我的解释是错误的,你还有其他想法吗?我试着搜索相关问题,但找不到答案: - /

P.S。:我正在使用Valgrind 3.9.0和GCC 4.8.2并启用了C ++ 11。完整的Valgrind消息:

Foo

2 个答案:

答案 0 :(得分:8)

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);

答案 1 :(得分:2)

这是未定义的行为。结果是一切依赖。您的程序可以正常执行,或者在同一平台,相同的编译器等上获得seg错误。所以为了避免这种情况,请在使用之前始终初始化指针。 在这种情况下:

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