zoukankan      html  css  js  c++  java
  • 内存管理工具,帮助检查内存泄露及野指针问题

    转载:https://www.cnblogs.com/songr/p/5438346.html

    #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;
    }

  • 相关阅读:
    笨蛋的厄运
    模仿写了一个摸鱼应用解决原作者的问题
    retain和copy还有assign的区别
    分析与理解通知消息WM_NOTIFY
    备忘录
    数据结构C++模板实现之单向链表
    服务器(VPS合租)
    复制构造,赋值操作符,const重要性
    Windows 注册表操作简介
    窗口类封装之窗口对象消息处理的映射方法(1)
  • 原文地址:https://www.cnblogs.com/Lucky-qin2013/p/14947930.html
Copyright © 2011-2022 走看看