2013-07-19 37 views
0

我有一個包含的QVariant的一個std ::數組類:是否std :: array調用default ctors?

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

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

我現在分析這個項目中使用英特爾®Parallel檢查和檢測
「未初始化內存訪問」在m_Attribs[0] = 41;

我一定手動調用std :: array中的元素的構造函數還是這是一個誤報?

回答

3

一個std::array陣列的大小是固定在編譯時,默認的構造方法(您的MyClass構造調用)默認構建體或複製構建該陣列的每QVariant。即我期望在構造函數的開始,數組中有42個QVariant對象,它們都是無效的(即isValid()返回false)。

分配應儘可能具有

m_Attribs[0] = QVariant(41); 

這似乎還好我有同樣的效果。

簡而言之:如果不是因爲英特爾的良好聲譽,我傾向於聲稱這是誤報。 : - }

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和鐺)