2016-09-19 8 views
0
class RawPixElement{ 
public: 
    CRawPixElement(int iRes) : m_iResolution(iRes) { 
     m_szRawData = new unsigned char[iRes * iRes]; 
    }; 

    ~CRawPixElement() { if(m_szRawData) delete[] m_szRawData; }; 

    CRawPixElement(const CRawPixElement &elem) : m_iResolution(elem.m_iResolution) { 
     m_szRawData = new unsigned char[m_iResolution * m_iResolution]; 
     memcpy(m_szRawData, elem.m_szRawData, m_iResolution * m_iResolution); 
    }; 

    CRawPixElement & operator=(const CRawPixElement &elem) { 
     m_iResolution = elem.m_iResolution; 
     memcpy(m_szRawData, elem.m_szRawData, m_iResolution * m_iResolution); 
     return *this; 
    }; 
private: 
    CRawPixElement(); 
public: 
    int m_iResolution; 
    unsigned char *m_szRawData; 
}; 

typedef std::vector<RawPixElement> RawPixList; 
RawPixList rpl; 

void addElement(const RawPixElement& elem) { 
    // find pos 
    RawPixList::const_iterator iter = rpl.cbegin(); 
    for (; iter != rpl.cend(); iter++) { 
     if (iter->getResolution() <= elem.getResolution()) { 
      break; 
     } 
    } 
    // rpl.insert(rpl.end(), elem) is OK. but not with rpl.begin() 
    rpl.insert(iter, elem); 
} 

int main(){ 
    RawPixElement e1(128); 
    RawPixElement e2(32); 
    RawPixElement e3(256); 
    RawPixElement e4(8); 
    RawPixElement e5(64); 
    RawPixElement e6(32); 
    addElement(e1); 
    addElement(e2); 
    addElement(e3); 
    addElement(e4); 
    addElement(e5); 
    addElement(e6); // Exception here!!!!!!!!!!!!!!!!!!!!!!!! 
    return 0; 
} 

私はstd :: vectorを使い、その中の要素をソートしたいと考えました。 要素をベクトルに追加するときに、関数 'addElement()'を呼び出すことで指定された位置に挿入されますが、 'push_back()'を使用して要素をベクトルの末尾にプッシュしません。 このようにして、ベクトルは使用時に順序付けられたままになります。 しかし、VS2010では、最後の 'addElement()'がコード内で呼び出されたときに、ランタイムエラーがstl例外のように見えることがありました。 gccとclangのコードをC++ 11とC++ 14の標準でテストしましたが、両方ともエラーがありました。 私はstd :: vectorを使ったやり方は間違っていたのですか、それともベクトルについてわからないものがありますか?レコードの場合: 'begin iterator'で同じシーケンスを挿入すると同じエラーが発生しますが、 'end iterator'ではokです。私は信じられないと思う!なぜVS2010に重複要素を挿入するとstd :: vector :: insertが失敗したのですか?

+0

クラス名はRawPixElementではなくCRawPixElementです。入力ミスについては申し訳ありません。 – gongweixue

+1

問題を解決するために使用できる質問の下部に編集ボタンがあります。または、これを使用することができます – NathanOliver

+0

なぜすべての手動メモリ管理がここにありますか? –

答えて

0

m_resが古い要素の値より大きい場合、 "operator ="で再割り当てする必要があります。

関連する問題