重构fS项目心得

 

重构fs心得:

1:一个模块一个堆,跨模块申请释放内存会造成crash.

   所以在模块之间传递含有通过堆申请释放内存数据成员 对象时,不要通过传值方式传递参数。

2:WTL或MFC中使用PostMessage携带参数传递时要注意,PostMessage是异步执行操作,所以有可能在PostMessage还没有将信息参数放入队列之前,参数的生命期结束,导致最后PostMessage不能将信息入队。

3:界面控制线程所需要执行的工作最好不要由自己的线程来承担,因为如果要这样做,需要考虑界面线程消息路由方面的工作,否则,消息路由不会按预期方式运行。

4:std::wstring在跨模块时,不要将std::wstring作为传递参数,而是要改成char* 或wchar*之类。

5:vector容器若要查找某一元素,优先可以考虑重载bool operator==(***)运算符。

6:编写代码时,如果有需要用到断言的地方,尽量使用。

7:如果map容器中放入vector元素,需要考虑先将map中的vector清楚,然后再清楚map,否则释放时会出现crash.

   例子代码如下:

    定义:

       typedef std::vector<CComPtr<IEmotionItem> > VEC_EMOTIONITEM;

s truct _EmotionMapItem : public CFSUnknownImpl<IFSUnknown>

          {

                   VEC_EMOTIONITEM vecEmotionItem;

                   VEC_EMOTIONITEM vecEmotionSkipItem;

          };

      typedef std::map<DWORD, CComPtr<_EmotionMapItem> > _MAP_VECEMOTIONITEM;

   释放代码:

     _MAP_VECEMOTIONITEM::iterator iterMap = m_mapVecEmotionItem.begin();

          for(; iterMap!=m_mapVecEmotionItem.end(); ++iterMap)

          {

                   VEC_EMOTIONITEM &tempE = (*(iterMap->second)).vecEmotionItem;

                   tempE.erase(tempE.begin(), tempE.end());

                   VEC_EMOTIONITEM &tempEP = (*(iterMap->second)).vecEmotionSkipItem;

                   tempEP.erase(tempEP.begin(), tempEP.end());

          }

      m_mapVecEmotionItem.clear();

8:使用delete只能释放由new申请的堆空间,如果不是new申请的就会造成crash.

9:WIN32 API的文件操作,使用FindFirstFile可以实现文件过滤查找。

10:多线程环境中,一个对象在执行析构函数时,如果这个对象中包含了线程执行函数且含有容器数据成员,

     一定要在析构容器的时候给容器加锁,不要使用默认析构内部数据成员数据方式,因为线程执行函数有可能会在析构之前修改数据,而stl不是线程安全的,这

     样就会造成crash;

     或者在执行析构之前,将执行线程函数的线程停止。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值