vector成员变量是否可以未初始化(内存错误)
Can a std::vector member variable be uninitialized (memory error)?
这是一个较大的模拟工具的源代码摘录:
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 );
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 如何在 malloc 内存中初始化非 POD 数据
- 犰狳C++ - 从常量内存初始化只读矩阵而不复制
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 获取有关使用未初始化内存的错误代码
- 取消初始化内存区域
- 如何使用构造函数初始化内存地址(指针变量)?
- 哪一种是在C 中分配非初始化内存的最惯用方法
- 用C++中的nan初始化内存进行调试
- 如何最好地处理具有未初始化内存的复制交换习惯用法
- 多少新的初始化内存到对象
- 在c++中不初始化内存而分配内存
- vector成员变量是否可以未初始化(内存错误)
- 用幻数初始化内存块的简明方法
- 使用已定义结构体的vector到达未初始化内存
- 用于调试的未初始化内存的常用值是什么?
- 强制g++为零初始化内存