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异常。我在C ++ 11和C ++ 14标准下测试了gcc和clang上的代码,两者都有错误。 是我使用std :: vector错误的方式,还是我不知道有关向量的东西?对于记录:在'begin iterator'处插入相同的序列时会发生相同的错误,但在'end iterator'处可以。我觉得这简直令人难以置信!
答案 0 :(得分:0)
当m_res大于旧元素的值时,需要在“operator =”中重新分配。