浅析常用STL中容器插入数据失败

昨天在上班的时候,碰到一个问题,关于 STL常用容器插入数据失败。

问题详细:在一个类构造函数填零后,那么map list 插入数据失败了,但是vector不会。测试代码如下:

 

 

class Test
{
public:

    Test(){memset(this,0,sizeof(*this));}
    void InsertElement(){m_map.insert(std::make_pair(1,1));   }
    void InsetElement_vector(){ m_vector.push_back(1);}
    void InserElementList(){m_list.push_front(1);}
private:
    std::map<int,int>  m_map;
    std::vector<int> m_vector;
    std::list<int> m_list;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Test p ;
    p.InsertElement();
    p.InsetElement_vector();
    p.InserElementList();
    return 0;
}

 其中 vecotr 成功,其余两个容器失败。~开始百思不得其解,估计着是  容器有特殊隐藏的数据结构,填0破坏了 容器的数据结构。。。。

  后来请教诸神,总结答案如下:

 非 pod 类型不要memset()初始化,会导致未定义行为,实际上就是破坏数据完整性。

 

关于POD类,相信有一部分人有点想不起它的定义,关于它的定义用简单的描述如:一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。

 

 

    

 

转载于:https://www.cnblogs.com/dragonmoon/p/4047103.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值