1

我有一个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中的所有字段都正常。

我使用以下参数运行 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 所说的是真的,为什么要执行构造函数?

4

2 回答 2

3

这可能意味着keycount包含未初始化的值。即使您确实在声明中对其进行了初始化,例如int key = foo + bar;,它也可能是未初始化的foo或未bar初始化的,并且 valgrind 将其带到key.

于 2009-09-07T00:48:31.687 回答
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];
于 2009-09-07T00:33:54.820 回答