使用memset要小心

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">     今天把程序重构了。运行一下,没想到程序到了退出的时候触发了一个ASSERT。看看栈信息,运行到了CString的析构函数:
  1. CString::~CString()
  2. //  free any attached data
  3. {
  4.     if (GetData() != _afxDataNil)
  5.     {
  6.         if (InterlockedDecrement(&GetData()->nRefs) <= 0)
  7.             FreeData(GetData());
  8.     }
  9. }

  10. _AFX_INLINE CStringData* CString::GetData() const
  11.     { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }

  12. class ImageItem
  13. {
  14. public:
  15.     ImageItem();
  16.     ~ImageItem();
  17.     unsigned int id;
  18.     unsigned int x;
  19.     unsigned int y;
  20.     CString filename;
  21.     HDC hdc;
  22.     BITMAP bmp;
  23.     HBITMAP hbmp;
  24.     HBITMAP hOldBmp;
  25. };
  26. class ImageList
  27. {
  28. public:
  29.     ImageList();
  30.     ~ImageList();
  31.     ImageItem images[128];
  32.     int m_imageCount;
  33. };

  34. ImageList::ImageList()
  35. {
  36.     memset( images, 0, sizeof(images) );
  37.     m_imageCount = 0;
  38. }

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">         m_pchData竟然等于NULL,怎么想也不明白。然后找新春帮忙看,原来是ImageList的构造函数里将CStringmemset了,编译期自然不会报错,而这个错误到了析构的时候才被发现。真是搞笑。看来以后要memset的时候要小心点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值