我有一个A类如下:
class A
{
public:
A()
{
printf("A constructed\n");
}
~A();
//no other constructors/assignment operators
}
我在其他地方有以下内容
A * _a;
我将其推向:
int count = ...
...
_a = new A[count];
我用
访问它int key = ....
...
A *a_inst = &(_a[key]);
....
它正常运行,并且执行构造函数中的printf,并且A中的所有字段都很好。
我用下面的args跑了Valgrind:
valgrind --leak-check=full --show-reachable=yes --track-origins=yes -v ./A_app
和Valgrind一直大喊大叫
Conditional jump or move depends on uninitialised value(s)
然后堆栈跟踪到访问者语句。
任何人都可以解释为什么会这样吗? 具体来说,如果Valgrind说的是真的,为什么构造函数被执行?
答案 0 :(得分:3)
这可能意味着key
或count
包含未初始化的值。即使你在声明中做了初始化,例如int key = foo + bar;
,可能是foo
或bar
未初始化,而valgrind将其转移到key
。
答案 1 :(得分:2)
修改:尝试设置A *a = 0;
在简化的场景中运行代码不会产生Valgrind的任何警告。请考虑以下代码:
#include <iostream>
class A
{
public:
A()
{
std::cout << "A" << std::endl;
}
};
int main()
{
A *a;
int count = 10;
a = new A[count];
int key = 1;
A *inst = &(a[key]);
return 0;
}
编译:
$ g++ -g main.cc -o main
并运行:
$ valgrind --leak-check=full --show-reachable=yes --track-origins=yes ./main
所以,我认为需要更多信息。您可能在定义_a和实际分配堆上的内存之间做了一些事情。我可能只是建议你将定义和分配合并为一行吗?
int count = 10;
A *a = new A[count];