C ++类实例数组初始化

时间:2009-09-07 00:23:43

标签: c++ arrays gcc g++ valgrind

我有一个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说的是真的,为什么构造函数被执行?

2 个答案:

答案 0 :(得分:3)

这可能意味着keycount包含未初始化的值。即使你在声明中做了初始化,例如int key = foo + bar;,可能是foobar未初始化,而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];