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