“正被停用的激活上下文不是最近激活的”的错误的解决

作者:朱金灿

来源:http://blog.csdn.net/clever101

 

       前几天同事叫我帮忙看一个问题,问题是这样的:MFC程序中创建了一个停靠栏窗口之后窗口跟视图窗口贴在一块是透明的,然后程序退出时崩溃。经过查看堆栈,发现错误信息是:正被停用的激活上下文不是最近激活的

 

        开始我对这个错误有点百思不得其解,通过查看他的代码,发现了问题所在:原来他在CMainFrame类的OnCreate函数里使用停靠栏类的局部变量创建停靠栏窗口。这样做有什么问题呢?大家知道,MFC的窗口类都是支持动态创建的,而MFC的动态创建机制的一步是将窗口类信息(如名字)之类保存在一个全局链表里(具体请见《深入浅出MFC》)。而使用窗口类的局部变量创建窗口意味着一处这个函数这个变量就析构了,而窗口类信息(如名字)之类还保存在全局链表里。当这个链表最后析构时发现窗口已经无效了,自然崩溃了。明白了这点,我叫同事将停靠栏类的局部变量改为CMainFrame类的数据成员,这样确保它是全局的有效对象。由此可以得知,支持MFC的动态创建的对象都必须是全局有效的对象,否则在程序退出时必然崩溃。

转载于:https://www.cnblogs.com/lanzhi/p/6469775.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值