zoukankan      html  css  js  c++  java
  • 手工实现一个野指针识别和内存泄漏排查工具

    // beforeMain.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    union Align;
    
    class CTest
    {
    public:
        int A;
        double B;
        CTest()
        {
            cout<<"构造函数"<<endl;    
        }
    
        ~CTest()
        {
            cout<<"析构"<<endl;
        }
    };
    
    
    union Align
    {
        struct
        {
        int a;
        int b;
        } data;
        long double ld;//确保开辟8个字节空间
    };
    
    static unsigned  totalMemoryBlock = 0;
    static unsigned  totalMemorySize = 0;
    //重载new操作符
    static void* operator new(size_t size)
    {
        Align* align = (Align* )new char[sizeof(Align) + size ];
        align->data.a = 0x1234;
        align->data.b = size;
        totalMemorySize += size; //记录内存分配
        totalMemoryBlock++;
        ++align;
        void* result = align;
        cout<<"operator new "<<endl;
        return result;
    }
    
    static void operator delete(void* _Ptr)
    {
        if (_Ptr == NULL)
        {
            cout<<"无法释放空指针"<<endl;    
            return;
        }
    
        Align* align = (Align*)_Ptr;
        if (align[-1].data.a == 0x1234)
        {
            cout<<"内存有效"<<endl;    
            align[-1].data.a = 0x4321;
            totalMemorySize -= align[-1].data.b;
            totalMemoryBlock--;
            delete[] (char*)--align;
    
        }
        else
        {
            cout<<"内存无效无法释放!野指针释放"<<endl;
        }
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        CTest* t1 = new CTest();
        CTest* t2 = new CTest();
        delete t1;
        delete t2;
        delete t1;
        delete t1;
        delete t1;
        CTest* t3 = new CTest();
    
        if (totalMemoryBlock > 0)
        {
            cout<<"内存泄漏!"<<endl;
            cout<<"泄漏大小 "<<totalMemorySize<<"字节"<<endl;
        }
    
        system("pause");
        return 0;
    }
    
    
    WAI 2016/4/27 11:56:50
    这是大规模C++程序设计上演示的一个 内存管理工具simple
    
    WAI 2016/4/27 11:57:09
    我不知道union可以这么玩的
  • 相关阅读:
    BZOJ 1050 旅行
    BZOJ 1040 骑士
    BZOJ 1038 瞭望塔
    BZOJ 1037 生日聚会
    BZOJ 1823 满汉全席
    BZOJ 3091 城市旅行
    CF702E Analysis of Pathes in Functional Graph
    Luogu 2154 [SDOI2009]虔诚的墓主人
    Luogu 1268 树的重量
    Luogu 4867 Gty的二逼妹子序列
  • 原文地址:https://www.cnblogs.com/songr/p/5438346.html
Copyright © 2011-2022 走看看