这是一个较大的模拟工具源代码的摘录:
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
答案 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 );