CPtrList 出错的问题

我新建的一个工程对话框的有CAboutDlgCMatchingAppCMatchingDlg我在某个头文件中定义的类中有个函数要用到一个自己定义的CPtrList类sta... 我新建的一个工程 对话框的 有CAboutDlg CMatchingApp CMatchingDlg我在某个头文件中定义的类中有个函数要用到一个自己定义的CPtrList类
static void readFeatureListFromFile(CFile* file,CWordObjectList& wordList);
typedef CTypedPtrList<CPtrList, CStrokeObject*> DllExport CStrokeObjectList;
我开始在CAboutDlg中声明了一个CPtrList变量JList,然后在对话框的一个按钮函数下用这个变量,没什么问题,这个函数的函数体在CAboutDlg中,现在我把按钮下的函数体抽出来重新写了个全局函数,因为要多次调用,然后现在无论把JList的声明放哪儿都不行。要不就是说未声明,要么就是报错Debug Assertion Failed!
说出错的位置是dbgheap.c
Expression:_CrtIsValidHeapPointer(pUserData)
我对这个类不是很了解 诚信提问 敬候高手指点
PS:程序运行没问题 return没有问题 就是exit的时候会出错
给解决方案 谢谢
展开
 我来答
百度网友05a5df392
2008-05-27 · 超过28用户采纳过TA的回答
知道答主
回答量:149
采纳率:0%
帮助的人:112万
展开全部
//以前遇到差不多的问题,以下的应该可以帮你
用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。 ITPUB个人空间`)kS3F1]2z?2e
ITPUB个人空间_ V*J v'xjp d
一、在应用程序类中定义
}!et ~o2aV"u.C0ITPUB个人空间X,Nd4pu @_/}8q1\J
用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。
Vjg-yqZ7z0
D!T-fJ'n[.Y!?0 从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用 “AfxGetApp()->成员”访问变量或函数。ITPUB个人空间.|&Q'l TA:JibRF

%Qv y F,Fn0 例:
/_0u.YYd0ITPUB个人空间0K1I f~_
Test.h:(应用程序类头文件)
xt*N}_2~6[8N.y0ITPUB个人空间,n/cx6`p%^q
class CTestApp : public CWinApp
^!o/E@U^O wb R(m h I0{
kY.B3~ i5WFr P0 public:
pm'n7x7q0 int x; //全局变量
%Q vv0~Y n0 int f(int y); //全局函数
'dV6aa[ K3F2QW0R0 …………
_8m&lk$\@"dV0}; ITPUB个人空间)J{-va*_K6|.d/g.YX
ITPUB个人空间_]I!IE&Z
Test.cpp:(应用程序类程序文件)ITPUB个人空间&F8c ` p)E&s.u

/n HnI @0int CTestApp::f(int y) //全局函数定义
R,?h$t H \ ~ ]0{
6g-bFd!Xj,Ent0 y++;
%x4G0I(z2J3}#b@{ |0 return y; ITPUB个人空间B f'\.ab wH%uT(A
}
?9UK@:MD8?~0ITPUB个人空间.KM9u)d4Q g
定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():ITPUB个人空间1@8v SP2]d o

:rq"UTp3k n0void CTestView::xyz()ITPUB个人空间Y-Ar(g"]1l Hh J0d
{ ITPUB个人空间5Ir%yZ(A
CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针 ITPUB个人空间3q jiWtpI:q p
app->x = 0; //访问变量x
_(DfeZ O�kq0 int z = app->f(1); //访问函数f() ITPUB个人空间'P!oagg'd
…………ITPUB个人空间U [I LWeN4f$w
}
{ ^.{1Xn%G0s;T0
@w`\G"Y)Y&S0 这样,变量x和函数f()可以视作为全局的。
z/nA jH1m"S|)W0
H~!X-w0N.e6AA"[0 用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。
"r j^-K0t"bo K.e)Qe rB0ITPUB个人空间*U }5n gBZ qoz#oc
二、用静态变量和静态函数实现
W O5SV3`rNa S0ITPUB个人空间W@s1r9NF @
很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。
ho D;@KU0ITPUB个人空间 D"E#B�c-kN'\c b0b
静态变量和静态函数有如下性质:
Kx9A_ }'?'KGT-b0ITPUB个人空间v(x7Z*^k5rg
若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。ITPUB个人空间d4tW(Q1JU

+\;|I G O0L0 若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。
?*jP-Q$gN0ITPUB个人空间&v2d5DV,KF'v6e
利用这个性质实现的全局变量和函数使用起来很方便。
e!g|3nwr J0ITPUB个人空间4s`&Ex l/dfh{
值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。ITPUB个人空间A&qg/^:Zk:U
ITPUB个人空间0t gG"H m
例:ITPUB个人空间;r[5Bn-Yx8F.md)L

8X Z�~1myi0 1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类
o&i)Z0F]\+S$I0
!m lzM iN0 单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。
kg&aCL.i8L0ITPUB个人空间bB�H!t!B,pcr
2、包含公用类的头文件,使各个类都能访问它
5@;|+Kid#W:U0
4L1|2Iy ~l.i4C'O6b0 CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。ITPUB个人空间%[ol rjg0xr$t$?
ITPUB个人空间p�L$mmpJ5Jb
Test.h:(应用程序类头文件)ITPUB个人空间)eB�[? t;g p l3c \

Y5I]X!O0#include "Public.h" //包含公用类头文件
_%htle0
U:@,r\PSH0class CTestApp : public CWinApp
%hVLyDVQC0{
"Ul8|%ma/FJw0…………
M�p/?,FF3\0}; ITPUB个人空间(fLh S%y

khv;?2Bk0 3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化
M le9v#Q0
8v k8DP]^y0 Public.h:(公用类头文件)
r*_.C@hmt:T?0ITPUB个人空间 c fho�Pij(WP:YM
class CPublicITPUB个人空间/UB;WOcr
{
.zY/of(dl5rC-yS4K0public: ITPUB个人空间#ypv k'U4ac#a ~ J!B
CPublic();
8TT9i2AcIMP0virtual ~CPublic();
-H9W y \#aT0
}!p;Wp0a-r0public:
/y3uF1f m*e z:m m/pC}]0static int x; //全局变量
7G3j0F0G&L9B+Z0static int time; //全局变量
T5W Z�I5_2R,z0static int f(int y); //全局函数
N9V,hx H1C$]5d0…………
`3BK a9b|J9H0} ITPUB个人空间9v Dv^ BL!F%{

"T*ot-K.Uhw1N0 在公用类中对静态变量进行初始化和定义函数体:ITPUB个人空间,}5\J4l$h*s8\$}

O]|$iE8FJz!r0 Public.cpp:(公用类程序文件)
v"h�e/^f U _5T.p!s0
%[X$I4GQ2`%F0int CPublic::x = 0; //初始化全局变量
+btgx9Ai0int CPublic::time; //定义全局变量 ITPUB个人空间n4e+b F |'t@;a,f

&]5~\(D!i'_4[+R ? p0CPublic::CPublic()
S4s#[a$h"m(A+A0{
BYjv"qC k0ITPUB个人空间 i,m�xzL(Z
} ITPUB个人空间y$IQ_G7[Z&~"R"i.I

0n:_+C|uZ)a0CPublic::~CPublic()
/U:P.O)JKdw0{ ITPUB个人空间8p!f4t(C%?P0z
ITPUB个人空间/]�Y ucZ1j6w
} ITPUB个人空间C1p8^hf&}qn7r

3H^Ost4O}$Q0int CPublic::f(int y) //全局函数,这里不要再加static ITPUB个人空间)R h5g3r)]:TD
{
f%S9OYm0y++; ITPUB个人空间�JV&v'I6QO
return y; ITPUB个人空间�H7vDN jz a
} ITPUB个人空间4KCj_ Gw)Vk u

Ds#lHS:[~!s1n b#[0 4、全局量的使用ITPUB个人空间/g-J5H;AT"v
ITPUB个人空间!M'Ke*sv/_.{+p6b
使用变量:CPublic::变量名
q O1u0LX&S[5B"gf0ITPUB个人空间S[%~Z.CN4LE
使用函数:CPublic::函数()ITPUB个人空间H,g$RD)KQ

3xp"\)c%jni u.fK0 如在视图的某函数中访问变量x和函数f():
#c9T } Qt*QB|ni2e@,c0
uC1L*Aw-q'YL.G0void CTestView::xyz()ITPUB个人空间B4Nyv7iV
{
5nQI^$Ix9e*vzZgu0CPublic::x = 0; //访问变量xITPUB个人空间KH7~'x8Z-lq+T
CPublic::time = CPublic::f(1); //访问函数f()ITPUB个人空间 h sF%T%Z c'UW
…………ITPUB个人空间;x!k8er;I5}c!Q~
}
W%Wk2H"nA"CT0
;mJ})M S*NW7S0 在其它类中访问x、time和f()的方法与此相同。ITPUB个人空间0B d W8i!LD5Cr

:?)T%@1_vM VGrW0 5、几点注意:
m1A!MF0?.JL`x#~{0
b"rs'?^(V0 ① 由于静态量可独立于类存在,不需要生成CPublic类的实例。
j*r%P E6`y)K tX1R0
5yR/zta\0 ② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。ITPUB个人空间YB+a aV%d d#r8~2V
ITPUB个人空间/u$E;GC;S o
③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:ITPUB个人空间Ac"_? @9b

2}8Or4WIXC e0class CPublic
LEeh1r5v,L0{ ITPUB个人空间5Z*mw Tm
public:
*E'?t1c%IB|vd'J0int x; //内部变量ITPUB个人空间oKA'{;N@ w
static int f(int y) //全局函数
2p$a(~g ASAM]0{ ITPUB个人空间`3h6i/IXQ^$P9D
x++;
)H'?9T&C[4BE}N^W0return x;
4o&K+Vzw(O8H0}; ITPUB个人空间h}i8S&c:z6DTg.p3o
…………
D@s4{$}0};
z5c)L*\ V0ITPUB个人空间uG"a/d"m m{
这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。ITPUB个人空间Z O[!u�K)U

:y1d RC;g$g?_,gn0 总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头

参考资料: http://space.itpub.net/?uid-70039-action-viewspace-itemid-201871

风轻云度
2008-05-27 · TA获得超过1423个赞
知道大有可为答主
回答量:1835
采纳率:0%
帮助的人:0
展开全部
内存写错了位置,在析构时要释放因为指针指向了程序以外的位置所以报错。

建议贴出代码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式