为什么vector::insert在正常使用的时候奇怪的抛出了异常

C++语言 码拜 8年前 (2016-09-20) 1474次浏览
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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么vector::insert在正常使用的时候奇怪的抛出了异常
喜欢 (0)
[1034331897@qq.com]
分享 (0)