duilib菜单开发遇见“0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”

在开发duilib菜单时,遇到程序在第二次关闭设备列表时崩溃的问题,错误表现为0xC0000005访问冲突。通过调试发现是delete操作不当引起,原本的delete操作在OnFinalMessage函数中,但会导致再次进入notify函数并报错。解决方案是使用计数变量控制设备列表的创建和删除,避免多次创建或删除。博客提到了duilib消息机制的不熟悉可能是问题的一部分,并分享了对duilib菜单更深入的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的程序是这样一个逻辑。 首先创建用户列表,点击列表项弹出菜单,点击菜单上“设备选项”,弹出设备列表,上面显示这个用户拥有的设备。

菜单的创建参考了这为博主的教程:http://www.cnblogs.com/Alberl/category/520438.html

如图点击列表项,弹出菜单中点击“设备”,运行新的窗口 “设备列表”。

 

接下来问题出现了,上面操作重复两遍,会在第二次关闭设备列表的时候 发生异常,程序崩溃。

这就让我非常头痛了。

我知道这种错误是内存访问问题,一般都是指针操作不当造成的。

调试程序,中断发生位置是notify函数(duilib响应函数)结束位置。总之不是发生错误的位置。

下面贴出菜单程序源代码:

MenuWnd2.h:

#pragma once

#include <windows.h>
#include "my_duilib.h"
#include <iostream>

class CUserManageMenuWnd: public CXMLWnd {
public:
    explicit CUserManageMenuWnd(LPCTSTR pszXMLPath,int tag);

protected:
    virtual ~CUserManageMenuWnd();   // 私有化析构函数,这样此对象只能通过new来生成,而不能直接定义变量。就保证了delete this不会出错

public:
    void Init(HWND hWndParent, POINT ptPos);
    virtual void    OnFinalMessage(HWND hWnd);
    virtual LRESULT HandleMessage (UINT uMsg, WPARAM wParam, LPARAM lParam);
    virtual LRESULT OnKillFocus   (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    virtual void Notify( TNotifyUI& msg );
private:
    int tag;
};

 

MenuWnd2.cpp:

#include "MenuWnd2.h"
#include "my_including.h"
#include "page_info.h"
#include "mysql_utils.h"
#include "user_dev_lst.h"

extern c_page_info page_info;
extern user_sel_ret* user_arr;

CUserManageMenuWnd::CUserManageMenuWnd( LPCTSTR pszXMLPath, int tag) 
: CXMLWnd(pszXMLPath){
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值