在公司这两年没少带新人,有刚毕业的,也有工作了两三年的。除了要把公司项目的一些知识告诉他们,通常了需要review一下他们的代码。发现很多人在C++的基本概念上存在错误或者偏差,或者某种习惯用法有瑕疵。这些问题千奇百怪,往往令人哭笑不得。一直想把他们记录下来,于是有了此系列。此系列标题取为Ineffective C++绝对没有想与大师比肩的意思,纯粹是为了搞笑。:)
STL容器不仅仅可以保存指针
struct tagItem
{
int nID;
int nNum;
};
他都要使用list<tagItem*>,最晕的是当需要一个列表保存一些物品ID时,我看到了下面的数据定义:
list<DWORD*> m_itemIDList,
每次需要添加一个时,就需要new一个DWORD,然后赋值,然后push_back到list中,在erase之后还要记得delete。
产生这种用法(下面只谈类似list<tagItem*>这种)多数处于两种原因:
1.
对STL不熟悉
list是否帮你保存对象呢?如果你使用list<tagItem>,当你push_back的时候发生了什么呢?如果你还不是很确定答案的话,那你一定要把《C++标准程序库—自修教程与参考手册》好好的读一遍。
2.
过分担心性能
有的人告诉我,他认为tagItem的拷贝会影响效率。恩,考虑到了效率,算是一个进步,但是这笔账还是要算得更清楚一些。tagItem对象到底占多少字节?你的这个list是不是会经常更新?每帧更新几次,还是当某个事件产生时才操作一次?多数情况下,这点性能损失时不值得你手动管理一个tagItem对象的内存的。
总结一下,对于简单的数据类型,强烈推荐使用list<tagItem>这种写法,除非你仔细考虑了性能问题。