重构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;
或者在执行析构之前,将执行线程函数的线程停止。
1116

被折叠的 条评论
为什么被折叠?



