使用memset要小心

来源:互联网 发布:明月心捏脸数据 编辑:程序博客网 时间:2024/04/29 14:36
    今天把程序重构了。运行一下,没想到程序到了退出的时候触发了一个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. }

        m_pchData竟然等于NULL,怎么想也不明白。然后找新春帮忙看,原来是ImageList的构造函数里将CStringmemset了,编译期自然不会报错,而这个错误到了析构的时候才被发现。真是搞笑。看来以后要memset的时候要小心点。

原创粉丝点击