万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0
这两天在写一些导出类库,在测试的时候遇到十分诡异的问题,使我遭受痛苦折磨。经验是写代码到处都可能是炸弹,如果不是见多识光还真有可能怀疑计算机或者相信有鬼。

下面来引入问题:
我写了一个类,需要保存Tooltip信息和一些动态数组信息。结构应该类似下面这样:
class SOMEDLL_API CSomeDll {
public:
    CSomeDll(
void);
    
// TODO: 在此添加您的方法。
    ~CSomeDll();

    TOOLINFO m_ti;
    
int* pInt;
}
;
为了说明问题适当调整了一下,实际情况那个动态数组使用的是stl容器,当然不影响问题说明。


这个想法很自然看起来也不可能有错误,于是我就做了测试,结果出现了问题。当时由于代码很多,我一段一段进行了分析,最终发现调用该导出类出的问题。这样我直接做了这样的测试:
CSomeDll* pPtr = new CSomeDll;
    delete pPtr;
结果错误,堆内存毁坏。百思不得其解,开始怀疑stl的分配器导致的问题,修改成自己写的集合类,仍然有问题。有开始一段一段屏蔽代码,最终发现只要TOOLINFO后面有动态数组就会导致问题,但是还是没有找到问题的根本。

开始不相信计算机了,开始怀疑有鬼了。无奈,新建一个win32的helloworld,删除所有代码和资源,只剩下winmain,重复上面的new和delete,发现居然没有问题了。真是见鬼了??难道预编译头都能引起内存问题吗??幸好同事zengfanmiao提到stdafx里面的内容让我突然想起那些定义的宏会不会导致内存分配问题。

查看TOOLINFO的定义:
typedef struct tagTOOLINFOW {
    UINT cbSize;
    UINT uFlags;
    HWND hwnd;
    UINT_PTR uId;
    RECT rect;
    HINSTANCE hinst;
    LPWSTR lpszText;
#
if (_WIN32_IE >= 0x0300)
    LPARAM lParam;
#endif
#
if (_WIN32_WINNT >= 0x0501)
    
void *lpReserved;
#endif
}
 TTTOOLINFOW, NEAR *PTOOLINFOW, *LPTTTOOLINFOW;

哦,天哪,发现眉目了,果然是这个宏定义导致的。在测试工程里面没有定义_WIN32_WINNT,而在dll里面定义该宏为0x0501。所以该对象大小在dll比在测试时大4个字节。一旦对dll里面数据进行了修改就会导致越界访问。这样在delete的时候,就会报错。

这个问题在之前就遇到过,但是不知道怎么就巧合避开了。这次终于了解了内幕,写代码还真的小心。MS产品线太长,os的维护导致大量结构体存在这样做法,只能摇头叹息,牢记牢记!!!
posted on 2007-07-17 22:12 万连文 阅读(1948) 评论(4)  编辑 收藏 引用 所属分类: 乱七八糟

FeedBack:
# re: 导出类使用值得注意的一个问题
2007-07-17 23:13 | sunny
把TOOLINFO m_ti;改成TOOLINFO *m_ti;就可以解决问题了。  回复  更多评论
  
# re: 导出类使用值得注意的一个问题
2007-07-18 08:36 | SmartPtr
这中错误一不小心就会出现,而且很难调,   回复  更多评论
  
# re: 导出类使用值得注意的一个问题
2007-07-18 09:25 | 金庆
导出类要保证类定义DLL内外一致。  回复  更多评论
  
# re: 导出类使用值得注意的一个问题
2007-07-18 21:34 | Corner Zhang
这样做还是会出tts问题的,若CSomeDll是个singleton这种在dll之外new 和 delete才不会出问题,为了避开tts问题可以在dll中加入对CSomeDll创建和销毁用的导出函数  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


简历下载
联系我

<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜