valgrind的未初始化值 - 指针

时间:2014-05-20 14:03:15

标签: c++ arrays pointers valgrind

我目前正在使用valgrind检查我的程序,一个小的测试程序给了我一些我无法理解的错误:

int size=10;
int i;

float * v1;
v1=new float[size];

float v2[size];

for (i=0;i<size;i++) v1[i]=0;
for (i=0;i<size;i++) v2[i]=0;

v1[0]=1;
v2[0]=1;

v2工作正常,但v1给出条件跳转或移动取决于valgrind上未初始化的值错误。

为什么会这样?另外,最好的做法是使用上面v2中的数组,还是一样?

提前感谢。

已编辑:添加了其余代码 - 错误显示在

v1=new float[size];
for (i=0;i<size;i++) v1[i]=0;
v1[0]=1;

2 个答案:

答案 0 :(得分:1)

您已为v1动态分配内存但未初始化它。它可以包含任何东西。

答案 1 :(得分:0)

  

为什么会这样?

可能是因为在初始化之前你已经读过内存了。

编辑:根据您添加的代码,您在初始化之前不会读取内存。似乎valgrind只是偏执狂,错误是误报。如果您打算将所有元素设置为相同的值,则使用值初始化会更简单。

  

此外,最佳做法是使用上面v2中的数组

是的,但不是因为没有错误。读取未初始化的堆栈内存与读取未初始化的动态内存一样错误。

通常,具有自动存储持续时间的变量优先于具有动态存储持续时间的变量。除非阵列很大,否则你不想耗尽宝贵的堆栈空间。或者如果size不是编译时常量,在这种情况下你不能在堆栈上分配它。