c++ - 使用 valgrind 的未初始化值 - 指针

标签 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;

最佳答案

Why does this happen?

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

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

Also, is it best practice to use arrays as in the v2 above

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

一般而言,具有自动存储持续时间的变量优于具有动态存储持续时间的变量。除非数组很大,否则您不想用完宝贵的堆栈空间。或者,如果 size 不是编译时常量,在这种情况下您不能在堆栈上分配它。

关于c++ - 使用 valgrind 的未初始化值 - 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23762007/

相关文章:

java - 找不到类的方法?

c - 段错误,尽管代码从未执行?

c++ - 试图了解指针返回类型的工作原理

C++ 写入损坏的文本文件

c++ - 将 1D vector 转换为 2D

c++ - 如何从带有通配符的路径中获取完整路径?

C: 数组初始化需要一个大括号括起来的初始化列表——简单代码

python - 在带有 pytorch 数据加载器的开始和结束的 zarr 数组上创建生成器

c++ - 反转 char 数组导致访问冲突

c++ - 最佳实践 : A compose B, DerivedA compose DerivedB