热门关键字:  ubuntu  分区  函数  Fedora  linux系统进程

当前位置 :| 主页>Linux教程>编程开发>C++>

谁动了我的指针

来源: 作者: 时间:2008-05-30 Tag: 点击:

  #include <malloc.h>

  void * :perator new(size_t size)
  {
    int stackvar;
    unsigned long stackvaraddr = (unsigned long)&stackvar;
    unsigned long argaddr = (unsigned long)&size;

    void ** retaddraddr = (void **)(stackvaraddr/2 + argaddr/2 + 2);

    void * retaddr = * retaddraddr;

    unsigned char *retbuffer = (unsigned char*)malloc(size + 16);

    memset(retbuffer, 0, 16);

    memcpy(retbuffer, &retaddr, sizeof(retaddr));

    memcpy(retbuffer + 4, &size, sizeof(size));

    return retbuffer + 16;
  }

  void :perator delete(void *buf)
  {
    int stackvar;
    if(!buf)
      return;

    unsigned long stackvaraddr = (unsigned long)&stackvar;
    unsigned long argaddr = (unsigned long)&buf;

    void ** retaddraddr = (void **)(stackvaraddr/2 + argaddr/2 + 2);

    void * retaddr = * retaddraddr;

    unsigned char* buf2 = (unsigned char*)buf;

    buf2 -= 8;

    memcpy(buf2, &retaddr, sizeof(retaddr));

    size_t size;

    buf2 -= 4;

    memcpy(&size, buf2, sizeof(buf2));

    buf2 += 8;

    buf2[0] = 0xde;
    buf2[1] = 0xad;
    buf2[2] = 0xbe;
    buf2[3] = 0xef;

    
    buf2 += 4;

    memset(buf2, 0x7777, size);

    // deallocating destroys saved addresses, so dont
    // buf -= 16;
    // free(buf);
  }

其它值得关注的地方:
  这段代码同样可以用于内存泄露的检测。只需修改delete运算符使它真正的去释放内存,并且在程序退出前,用__heapwalk遍历所有已分配的内存块并把调用new的地址提取出来,这就将得到一份没有被delete匹配的new调用列表。
  还要注意的是:这里列出的代码只能在调试的时候去使用,如果你把它段代码放到最终的产品中,会导致程序运行时内存被大量的消耗。

上一篇:c++函数调用
下一篇:C++的中抽象
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
栏目列表