74.游戏分析工具的异常定位和修复

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:易道云信息技术研究院

上一个内容:73.游戏分析工具的添加对象与删除对象

73.游戏分析工具的添加对象与删除对象 它的代码会报堆被破坏的异常,堆被破坏的异常主要由两方面,第一个是内存超范围访问比如分配了10字节内存访问的时候访问了200个字节就是把是我们的内存给修改了就会出错,第二个二次释放第一次的时候把内存释放了第二次又删然后windows有内存管理的机制第二次删的就会把别的地方的内存给删了,避免这种异常在用指针的时候一定要初始化并且控制只删一次内存

COBJContext.h文件的修改

cpp 复制代码
#pragma once
class COBJContext
{
    CString txtFile;
    CString txtName;
    LPVOID Address;// 内存地址
    /**
        内存地址不是一个简单的数字,它有可能是一个 基址 加上 一个数字,有可能还是一个指针算出来的
        然后这种的通过字符串进行记录,让它通过字符串可以算出内存地址
        Address 与 txtAddress配套使用
    */
    CString txtAddress;
    DWORD Size{};
    CString txtNote;
    char* data{};
public:
    COBJContext(const wchar_t* folder, const wchar_t* _name);
    COBJContext(const wchar_t* folder, const wchar_t* _name, const wchar_t * _address, DWORD _size, const wchar_t* _note);
    ~COBJContext();
public:
    void Save();
    void Delete();
    BOOL UpdateData(HANDLE _hProcess);
    void Set(const wchar_t* _name, const wchar_t* _address, DWORD _size, const wchar_t* _note, bool IsSet=true);
public:
    DWORD GetSize();
    CString& GetAddress();
    CString& GetNote();
};

typedef struct TREE_DATA {
    DWORD MenuId{};
    LPVOID DATA_PTR{};
}*PTREE_DATA;

CwndRAN.cpp的修改

cpp 复制代码
void CwndRAN::OnNMRClickTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    DWORD dMenuId = 1;
    if (hProcess) {
        auto hSel = mTree.GetSelectedItem();
        if (hSel) {
            PTREE_DATA val = (PTREE_DATA)mTree.GetItemData(hSel);
            if (val)dMenuId = val->MenuId; else dMenuId = 0;
        }
        else dMenuId = 2;
    }
    if (dMenuId == 0)return;
    // 获取最后一个消息发生时的鼠标位置
    DWORD dwPos = GetMessagePos();
    CPoint point(LOWORD(dwPos), HIWORD(dwPos));
    CMenu menu;
    menu.LoadMenuW(IDR_MENU1);
    CMenu* pop = menu.GetSubMenu(dMenuId);
    pop->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
    
}
void CwndRAN::DeleteItemEx(HTREEITEM h)
{
    PTREE_DATA val = (PTREE_DATA)mTree.GetItemData(h);
    if (val)delete val;
    mTree.DeleteItem(h);
}
void CwndRAN::OnDeleteClass()
{
    // TODO: 在此添加命令处理程序代码
    auto hSel = mTree.GetSelectedItem();
    auto hRoot = mTree.GetRootItem();
    if (hSel == hRoot)return;
    auto h = GetFirstItem(hSel);
    PTREE_DATA VAL = (PTREE_DATA)mTree.GetItemData(h);
    if (VAL) {
        COBJContext* p = (COBJContext*)VAL->DATA_PTR;
        if (p) {
            p->Delete();
            delete p;
        }
    }
    DeleteItemEx(h);
}

相关推荐
黄焖鸡能干四碗21 分钟前
网络安全建设实施方案(Word文件参考下载)
大数据·网络·人工智能·安全·web安全·制造
2301_8194143027 分钟前
C++与区块链智能合约
开发语言·c++·算法
不想看见40434 分钟前
Valid Parentheses栈和队列--力扣101算法题解笔记
开发语言·数据结构·c++
老约家的可汗42 分钟前
C/C++内存管理探秘:从内存分布到new/delete的底层原理
c语言·c++
天赐学c语言1 小时前
Linux - 应用层自定义协议与序列/反序列化
linux·服务器·网络·c++
计算机安禾1 小时前
【C语言程序设计】第37篇:链表数据结构(一):单向链表的实现
c语言·开发语言·数据结构·c++·算法·链表·蓝桥杯
hzhsec1 小时前
MSF-CobaltStrike实现内网socks代理转发上线
服务器·网络·安全·网络安全
阿贵---1 小时前
C++构建缓存加速
开发语言·c++·算法
脆皮的饭桶1 小时前
结合使用,实现IPVS的高可用性、利用VRRP Script 实现全能高可用
运维·服务器·网络
波特率1152001 小时前
C++当中is-a(继承)与has-a(成员对象)的辨析与使用指南(包含实际工程当中的使用示例)
c++·ros·串口通信