我目前正在使用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;
答案 0 :(得分:1)
您已为v1动态分配内存但未初始化它。它可以包含任何东西。
答案 1 :(得分:0)
为什么会这样?
可能是因为在初始化之前你已经读过内存了。
编辑:根据您添加的代码,您在初始化之前不会读取内存。似乎valgrind只是偏执狂,错误是误报。如果您打算将所有元素设置为相同的值,则使用值初始化会更简单。
此外,最佳做法是使用上面v2中的数组
是的,但不是因为没有错误。读取未初始化的堆栈内存与读取未初始化的动态内存一样错误。
通常,具有自动存储持续时间的变量优先于具有动态存储持续时间的变量。除非阵列很大,否则你不想耗尽宝贵的堆栈空间。或者如果size
不是编译时常量,在这种情况下你不能在堆栈上分配它。