class Foo{
public:
// 构造和析构
Foo(int iRes) : m_res(iRes) {
m_szData = new unsigned char[iRes * iRes];
};
~Foo() { if(m_szData) delete[] m_szData; };
// 拷贝和=号重载
Foo(const Foo &elem) : m_res(elem.m_res) {
m_szData = new unsigned char[m_res * m_res];
memcpy(m_szData, elem.m_szData, m_res * m_res);
};
Foo & operator=(const Foo &elem) {
m_res = elem.m_res;
memcpy(m_szData, elem.m_szData, m_res * m_res);
return *this;
};
private:
Foo();
public:
int m_res;
unsigned char *m_szData;
};
typedef std::vector<Foo> FooVec;
FooVec vecFoo;
// 插入函数
void addElement(const Foo& elem) {
// 找插入的位置
FooVec::const_iterator iter = vecFoo.cbegin();
for (; iter != vecFoo.cend(); iter++) {
if (iter->getResolution() <= elem.getResolution()) {
break;
}
}
// 经过测试,都从end插入没有问题,但是都从begin插入的话也抛出异常
vecFoo.insert(iter, elem);
}
int main(){
Foo e1(128);
Foo e2(32);
Foo e3(256);
Foo e4(8);
Foo e5(64);
Foo e6(32);
addElement(e1);
addElement(e2);
addElement(e3);
addElement(e4);
addElement(e5);
addElement(e6); // 运行到这个地方的时候,应当插入在e2元素之前,但抛出了异常
return 0;
}
代码如上。主要就是将一个vector里面的元素在插入的时候进行排序操作,使得他们存储的时候保持有序的状态。之所以不用multi-map是原因是这数据结构定义也不是本人定的,现在没办法改。本人假如想让内部元素有序,就例如保证在添加的时候进行插入排序。
但是在插入的时候,编译链接都没问题,运行时添加e6元素的时候抛出了异常。而且奇怪的是:按照vector的insert操作都应该调用的是拷贝构造函数,而e6插入的时候调用的是操作符重载来复制对象到vector里面的,复制之后return就抛异常了。看上去好像是CRT抛的,但本人也不确定。在VS2010上测试是这种情况,GCC和Clang也一样,C++98、11、14都这样,所以也不敢说是编译器的问题。
大家有没有什么思路点播一下本人,是本人的使用方法不对么,还是这里面有什么本人不知道的vector的事情?
谢谢各位。
解决方案
20
operator= 里应有一个 realloc