0

我有一个包含 QVariant 的 std::array 的类:

    class MyClass()
    {
        typedef std::array<QVariant, 42> attribs_t;
        attribs_t                        m_Attribs;

    public:
        MyClass()
        {
            m_Attribs[0] = 41;
        }
    };

我现在使用 Intel Parallel 检查器分析了这个项目,它检测到
“未初始化的内存访问”m_Attribs[0] = 41;

我必须手动调用 std::array 中元素的构造函数还是误报?

4

2 回答 2

3

数组的大小std::array在编译时是固定的,默认构造函数(你的MyClass构造函数调用)默认构造或复制构造每个QVariant数组。即我希望在您的构造函数的开头,您QVariant的数组中有 42 个对象并且它们都是无效的(即isValid()返回 false)。

分配应该具有相同的效果

m_Attribs[0] = QVariant( 41 );

这对我来说似乎没问题。

简而言之:如果不是因为英特尔的良好声誉,我倾向于声称这是误报。:-}

于 2013-07-19T10:14:28.880 回答
1

我认为你的代码很好。

示例代码:

#include <iostream>
#include <array>

struct QVariant {
    QVariant () : v_(0) { std::cout << "Constructed" << std::endl; }
    QVariant & operator=(int x) { std::cout << "Assigned" << std::endl;
                                     v_ = x; return *this; }
    int v_;
    };

class MyClass {
    typedef std::array<QVariant, 5> attribs_t;  // 5 instead of 42
    attribs_t                        m_Attribs;

public:
    MyClass() {
        m_Attribs[0] = 41;
    }
};

int main(int argc, const char* argv[]) {
    MyClass mc;
    return 0;
}

应该打印:

Constructed
Constructed
Constructed
Constructed
Constructed
Assigned

并且确实(在 gcc 和 clang 上)

于 2013-07-19T15:45:14.257 回答