萬星星@豌豆莢 歡迎加入我們
一個(gè)吃軟飯的男人!!!!!我只想寫程序####
微博:
http://weibo.com/wanlianwen
C++博客
首頁
新文章
新隨筆
聚合
管理
posts - 172, comments - 1253, trackbacks - 0
導(dǎo)出類使用值得注意的一個(gè)問題
這兩天在寫一些導(dǎo)出類庫,在測(cè)試的時(shí)候遇到十分詭異的問題,使我遭受痛苦折磨。經(jīng)驗(yàn)是寫代碼到處都可能是炸彈,如果不是見多識(shí)光還真有可能懷疑計(jì)算機(jī)或者相信有鬼。
下面來引入問題:
我寫了一個(gè)類,需要保存Tooltip信息和一些動(dòng)態(tài)數(shù)組信息。結(jié)構(gòu)應(yīng)該類似下面這樣:
class
SOMEDLL_API CSomeDll
{
public
:
CSomeDll(
void
);
//
TODO: 在此添加您的方法。
~
CSomeDll();
TOOLINFO m_ti;
int
*
pInt;
}
;
為了說明問題適當(dāng)調(diào)整了一下,實(shí)際情況那個(gè)動(dòng)態(tài)數(shù)組使用的是stl容器,當(dāng)然不影響問題說明。
這個(gè)想法很自然看起來也不可能有錯(cuò)誤,于是我就做了測(cè)試,結(jié)果出現(xiàn)了問題。當(dāng)時(shí)由于代碼很多,我一段一段進(jìn)行了分析,最終發(fā)現(xiàn)調(diào)用該導(dǎo)出類出的問題。這樣我直接做了這樣的測(cè)試:
CSomeDll
*
pPtr
=
new
CSomeDll;
delete pPtr;
結(jié)果錯(cuò)誤,堆內(nèi)存毀壞。百思不得其解,開始懷疑stl的分配器導(dǎo)致的問題,修改成自己寫的集合類,仍然有問題。有開始一段一段屏蔽代碼,最終發(fā)現(xiàn)只要TOOLINFO后面有動(dòng)態(tài)數(shù)組就會(huì)導(dǎo)致問題,但是還是沒有找到問題的根本。
開始不相信計(jì)算機(jī)了,開始懷疑有鬼了。無奈,新建一個(gè)win32的helloworld,刪除所有代碼和資源,只剩下winmain,重復(fù)上面的new和delete,發(fā)現(xiàn)居然沒有問題了。真是見鬼了??難道預(yù)編譯頭都能引起內(nèi)存問題嗎??幸好同事zengfanmiao提到stdafx里面的內(nèi)容讓我突然想起那些定義的宏會(huì)不會(huì)導(dǎo)致內(nèi)存分配問題。
查看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;
哦,天哪,發(fā)現(xiàn)眉目了,果然是這個(gè)宏定義導(dǎo)致的。在測(cè)試工程里面沒有定義_WIN32_WINNT,而在dll里面定義該宏為
0x0501。所以該對(duì)象大小在dll比在測(cè)試時(shí)大4個(gè)字節(jié)。一旦對(duì)dll里面數(shù)據(jù)進(jìn)行了修改就會(huì)導(dǎo)致越界訪問。這樣在delete的時(shí)候,就會(huì)報(bào)錯(cuò)。
這個(gè)問題在之前就遇到過,但是不知道怎么就巧合避開了。這次終于了解了內(nèi)幕,寫代碼還真的小心。MS產(chǎn)品線太長,os的維護(hù)導(dǎo)致大量結(jié)構(gòu)體存在這樣做法,只能搖頭嘆息,牢記牢記!!!
posted on 2007-07-17 22:12
萬連文
閱讀(1959)
評(píng)論(4)
編輯
收藏
引用
所屬分類:
亂七八糟
FeedBack:
#
re: 導(dǎo)出類使用值得注意的一個(gè)問題
2007-07-17 23:13 |
sunny
把TOOLINFO m_ti;改成TOOLINFO *m_ti;就可以解決問題了。
回復(fù)
更多評(píng)論
#
re: 導(dǎo)出類使用值得注意的一個(gè)問題
2007-07-18 08:36 |
SmartPtr
這中錯(cuò)誤一不小心就會(huì)出現(xiàn),而且很難調(diào),
回復(fù)
更多評(píng)論
#
re: 導(dǎo)出類使用值得注意的一個(gè)問題
2007-07-18 09:25 |
金慶
導(dǎo)出類要保證類定義DLL內(nèi)外一致。
回復(fù)
更多評(píng)論
#
re: 導(dǎo)出類使用值得注意的一個(gè)問題
2007-07-18 21:34 |
Corner Zhang
這樣做還是會(huì)出tts問題的,若CSomeDll是個(gè)singleton這種在dll之外new 和 delete才不會(huì)出問題,為了避開tts問題可以在dll中加入對(duì)CSomeDll創(chuàng)建和銷毀用的導(dǎo)出函數(shù)
回復(fù)
更多評(píng)論
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
幫朋友尋找一個(gè)后臺(tái)開發(fā)
我對(duì)谷歌的chromium和android發(fā)展的看法
一些自己的想法,歡迎討論
2010年總結(jié):
停止博客更新
臨時(shí)備忘
設(shè)置樹節(jié)點(diǎn)高度的一種方法
技術(shù)回歸01-Windows內(nèi)存分配工具
筆記本顯示器不亮,有人遇見過嗎??
linux學(xué)習(xí)一:wchar輸出
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
簡歷下載
聯(lián)系我
<
2025年5月
>
日
一
二
三
四
五
六
27
28
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
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(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)
相冊(cè)
new
個(gè)人相冊(cè)
搜索
最新評(píng)論
1.?re: 用MFC實(shí)現(xiàn)WebGUI--(CDHtmlDialog)
前輩好,代碼下載之后怎么用啊?我生成的exe打開是空白的頁面,菜單新建不知道建的啥,打開一個(gè)html頁面也沒有反應(yīng),我的環(huán)境是vs2010
--王同林
2.?re: 使MFC變漂亮一:MFC與Flash交互示例
能不能把Flash源文件共享一下,要不然Flash端變量不知道怎么操作
--ddd
3.?re: 甘特圖第一版本發(fā)布
你這個(gè)附件有什么功能限制?
--xrczld
4.?re: 并行編程--MPI開發(fā)入門
我是用的vs+MPICH2,用wmpiexec運(yùn)行我的exe的時(shí)候,不能連接到主機(jī)是什么鬼啊。。求回復(fù)
--M琨M
5.?re: 基于Chrome開源提取的界面開發(fā)框架 三(.3)
豌豆莢非常不錯(cuò)的應(yīng)用
--mmocake
閱讀排行榜
1.?基于Chrome開源提取的界面開發(fā)框架開篇(32394)
2.?用MFC實(shí)現(xiàn)WebGUI--(CDHtmlDialog)(26024)
3.?并行編程--MPI開發(fā)入門(19187)
4.?使MFC變漂亮二:MFC與HTML交互示例(17478)
5.?FreeType2研究(16106)
評(píng)論排行榜
1.?我把初戀搞丟了(原創(chuàng))(55)
2.?一個(gè)小型繪圖程序(45)
3.?并行編程--MPI開發(fā)入門(42)
4.?我得C++學(xué)習(xí)心得(41)
5.?用MFC實(shí)現(xiàn)WebGUI--(CDHtmlDialog)(40)
Copyright ©2025 萬連文 Powered By
博客園
模板提供:
滬江博客
国产精品99久久久久久董美香
|
一级a性色生活片久久无少妇一级婬片免费放
|
亚洲精品乱码久久久久久蜜桃不卡
|
久久精品国产半推半就
|
老司机国内精品久久久久
|
99久久国产亚洲高清观看2024
|
久久无码一区二区三区少妇
|
无码任你躁久久久久久久
|
亚洲av日韩精品久久久久久a
|
精品九九久久国内精品
|
国産精品久久久久久久
|
久久精品国产免费观看
|
国内精品久久久久久中文字幕
|
亚洲精品乱码久久久久久蜜桃不卡
|
国产精品久久久久久久午夜片
|
热久久国产欧美一区二区精品
|
亚洲精品国产字幕久久不卡
|
久久激情五月丁香伊人
|
亚洲欧美伊人久久综合一区二区
|
91久久精品国产免费直播
|
亚洲综合熟女久久久30p
|
久久免费视频6
|
久久国产一区二区
|
亚洲国产精品无码久久SM
|
欧美日韩成人精品久久久免费看
|
99国产精品久久久久久久成人热
|
无码人妻少妇久久中文字幕
|
久久精品国产99国产精品
|
很黄很污的网站久久mimi色
|
99久久免费国产精精品
|
亚洲AV日韩精品久久久久久
|
jizzjizz国产精品久久
|
模特私拍国产精品久久
|
久久久久国产亚洲AV麻豆
|
91精品国产91热久久久久福利
|
久久久久亚洲精品无码网址
|
日韩欧美亚洲综合久久影院d3
|
avtt天堂网久久精品
|
国产亚洲欧美成人久久片
|
热久久国产精品
|
精品久久久久久99人妻
|