C++ operator new[]和Debug Heap

原创 2007年09月19日 21:34:00

C++ operator new[]和Debug Heap

原贴地址:
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!1490.entry
原贴时间:
2006-08-15
原贴作者:
eparg

如果在VS2005下面想用CRT Debug Heap来调试Memory Leak,最后可以用_CrtDumpMemoryLeaks 把所有的leak打印出来。尝试下面的代码,会怎样:

#include "stdafx.h"

#ifdef _DEBUG

#define _CRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

#endif

#define MY_NEW[s] new(s,_NORMAL_BLOCK, __FILE__, __LINE__)

#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)

#define new MY_NEW

#endif

int _tmain(int argc, _TCHAR* argv[])

{

char *p=new char[10];

void *p2=malloc(10);

#ifdef _DEBUG

_CrtDumpMemoryLeaks();

#endif

return 0;

}

运行后会看到:

Detected memory leaks!

Dumping objects ->

c:/documents and settings/lixiong/my documents/mycode/detectleak/detectleak/detectleak.cpp(17) : {87} normal block at 0x003A8130, 10 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD

c:/program files/microsoft visual studio 8/vc/include/crtdbg.h(1150) : {86} normal block at 0x003A3240, 10 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD

Object dump complete.

The program '[808] DetectLeak.exe: Native' has exited with code 0 (0x0).

注意这里打印出的第一个leak,出现在detectleak.cpp17行,对应的是malloc语句,没问题

可是第二个leak,出现在crtdbg.h1150行,而不是new char[10]那里,怎么回事?如果不能定位到正确的源代码,还有什么用呢?

为了搞清楚这个问题,可以看看mallocdebug heap下的的定义:

#ifdef _CRTDBG_MAP_ALLOC

#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)

注意看,这里用了__FILE__, __LINE__两个预处理器Directive:

The #line Directive
http://msdn2.microsoft.com/en-us/library/b5w2czay.aspx

由于与处理器自动把文件名和行号传递给了_malloc_dbg函数,最后的output窗口才可以打印出源代码行

那好,看看debug heapnew的定义。由于newC++的关键字,而且是一个操作符,所以debug heap下定义为:

inline __bcount(_Size) void* __CRTDECL operator new[](size_t _Size)

{ return ::operator new[](_Size, _NORMAL_BLOCK, __FILE__, __LINE__); }

注意这里没有用#define,而是inline。同时该定义是在crtdbg.h文件中的。所以最后得到的是文件名是crtdbg.h。你可能有如下疑问:

1. 为什么不用#define而要用inline呢,改成#define可以吗?
你试试看吧,看能不能该成#define。由于这里有一个中括号,麻烦来了吧。谁让你是C++呢?bs一下C++

2. 为什么预处理器看到inline函数,不把inline后的行号和文件名字作为解释呢?
这我就不确定了啦。不过根据C++标准,标示为inline函数不是一定就要inline的,人家标准就定义得模棱两可,你何必强求预处理器呢?

所以,解决方法就是,所有的内存分配,就用:

#ifdef _CRTDBG_MAP_ALLOC

char *test=(char*)::operator new[](20, _NORMAL_BLOCK, __FILE__, __LINE__);

#else

char *test=new char[20];

#endif

你有其它好方法吗?

 

检测内存泄露的常用手段:debugnew

检测内存泄露的工具:debugnew网上有一个流传甚广的检测内存泄露的工具:debugnew(debugnew.h/debugnew.cpp)用法很简单,把debugnew.cpp放在项目里一起编译,...
  • coldcrane
  • coldcrane
  • 2004年12月30日 09:54
  • 3698

解析C++中的new、operator new、operator new[]和delete、operator delete、operator delete[](下)

注:以下测试均在VS2015下进行,其他编译器可能会有轻微差别。 继续整理第二部分的内容。 二、operator new/delete,以及其对应的数组版本new[]/delete[]。 ...
  • beyongwang
  • beyongwang
  • 2016年10月23日 23:28
  • 214

[C++再学习系列] 深入new/delete:Operator new的全局重载

Operator new的全局重载我们经常看到这么一句话:operator new可以重载,placement new不可重载。其实此处所说的不可重载应该是指全局的placement new不可重载,...
  • zhenjing
  • zhenjing
  • 2009年07月16日 21:52
  • 4534

new,malloc和::operator new

运行程序离不开内存管理,c内存管理离不开malloc和free,c++内存管理离不开new和delete。 虽说都是为了申请内存和释放内存,但new和malloc还是有区别的,这里总结下: 两者联...
  • u014557232
  • u014557232
  • 2016年01月04日 15:08
  • 1268

C++的三种new简介及重载局部(类内部)与全局operator new

先简单解释下C++的三种new,由于它们的名字实在是。。我就说的通俗点。1、new运算符(new operator)大哥,我们在代码中直接使用的就是它。它做2件事:调用后两种new申请内存和初始化对象...
  • qq_29227939
  • qq_29227939
  • 2016年06月11日 21:35
  • 3334

c++中堆和栈的的区别(stack vs heap)

 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操...
  • hyqsong
  • hyqsong
  • 2014年12月18日 15:57
  • 2788

【C++】 深入探究 new 和 delete

在C++中,我们应该经常会用到new、delete,它们是C++的一个关键字,同时也是一个操作符,下面我将我对这两者的了解和学习做一个总结和探讨。new和delete的全过程首先我们定义一个对象A: ...
  • codedoctor
  • codedoctor
  • 2017年07月27日 14:29
  • 589

全面解析C++中的new,operator new与placement new

全面解析C++中的new,operator new与placement new   以下是C++中的new,operator new与placement new进行了详细的说明介绍,需要的朋友...
  • walkerkalr
  • walkerkalr
  • 2014年03月27日 12:54
  • 660

operator new" vs. "new operator" 关系与区别

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8033503 先举个例子:  “operator new”: clas...
  • zhangxaochen
  • zhangxaochen
  • 2012年09月30日 00:22
  • 2174

c++中优化内存分配:new/delete操作符;allocator类对象的使用;operator new/operator delete函数及定位new表达式

1、C语言、c++中动态分配内存用什么?   C语言中动态分配/释放内存用malloc( )和free( )函数,c++中使用new和delete表达式。 2、既然有了malloc( )和...
  • wly_2014
  • wly_2014
  • 2016年01月27日 11:37
  • 527
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ operator new[]和Debug Heap
举报原因:
原因补充:

(最多只允许输入30个字)