std :: array是否调用默认ctors?

时间:2013-07-19 10:02:44

标签: visual-studio-2010 qt c++11

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

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

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

我现在使用Intel Parallel inspector分析了这个项目,它检测到了 m_Attribs[0] = 41;

处的“未初始化的内存访问”

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

2 个答案:

答案 0 :(得分:3)

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

作业应与

具有相同的效果
m_Attribs[0] = QVariant( 41 );

对我来说似乎没问题。

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

答案 1 :(得分: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上)