万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:
http://weibo.com/wanlianwen
C++博客
首页
新文章
新随笔
聚合
管理
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创建和销毁用的导出函数
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
帮朋友寻找一个后台开发
我对谷歌的chromium和android发展的看法
一些自己的想法,欢迎讨论
2010年总结:
停止博客更新
临时备忘
设置树节点高度的一种方法
技术回归01-Windows内存分配工具
笔记本显示器不亮,有人遇见过吗??
linux学习一:wchar输出
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
简历下载
联系我
<
2007年5月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(66)
给我留言
查看公开留言
查看私人留言
随笔分类
.NET(6)
ACDK(6)
ATL(11)
MFC(29)
richedit(9)
WTL(1)
乱七八糟(61)
模板(8)
小作品(40)
随笔档案
2013年3月 (2)
2012年9月 (2)
2012年8月 (2)
2012年7月 (2)
2012年6月 (3)
2012年5月 (2)
2011年9月 (2)
2011年8月 (1)
2011年6月 (2)
2011年5月 (4)
2011年4月 (2)
2011年3月 (2)
2010年12月 (1)
2009年9月 (1)
2009年8月 (2)
2009年7月 (2)
2009年6月 (2)
2009年5月 (1)
2009年4月 (1)
2009年1月 (1)
2008年12月 (5)
2008年11月 (2)
2008年10月 (1)
2008年9月 (7)
2008年8月 (2)
2008年3月 (3)
2008年2月 (2)
2008年1月 (3)
2007年12月 (6)
2007年11月 (1)
2007年10月 (3)
2007年9月 (1)
2007年8月 (5)
2007年7月 (5)
2007年6月 (3)
2007年5月 (5)
2007年4月 (5)
2007年3月 (4)
2007年2月 (2)
2007年1月 (2)
2006年12月 (4)
2006年11月 (8)
2006年10月 (1)
2006年9月 (9)
2006年8月 (7)
2006年7月 (10)
2006年6月 (1)
2006年5月 (2)
2006年4月 (10)
2006年3月 (3)
2006年2月 (3)
2006年1月 (2)
2005年12月 (8)
相册
new
个人相册
搜索
最新评论
1. re: 用MFC实现WebGUI--(CDHtmlDialog)
前辈好,代码下载之后怎么用啊?我生成的exe打开是空白的页面,菜单新建不知道建的啥,打开一个html页面也没有反应,我的环境是vs2010
--王同林
2. re: 使MFC变漂亮一:MFC与Flash交互示例
能不能把Flash源文件共享一下,要不然Flash端变量不知道怎么操作
--ddd
3. re: 甘特图第一版本发布
你这个附件有什么功能限制?
--xrczld
4. re: 并行编程--MPI开发入门
我是用的vs+MPICH2,用wmpiexec运行我的exe的时候,不能连接到主机是什么鬼啊。。求回复
--M琨M
5. re: 基于Chrome开源提取的界面开发框架 三(.3)
豌豆荚非常不错的应用
--mmocake
阅读排行榜
1. 基于Chrome开源提取的界面开发框架开篇(32335)
2. 用MFC实现WebGUI--(CDHtmlDialog)(25932)
3. 并行编程--MPI开发入门(19141)
4. 使MFC变漂亮二:MFC与HTML交互示例(17374)
5. FreeType2研究(16081)
评论排行榜
1. 我把初恋搞丢了(原创)(55)
2. 一个小型绘图程序(45)
3. 并行编程--MPI开发入门(42)
4. 我得C++学习心得(41)
5. 用MFC实现WebGUI--(CDHtmlDialog)(40)