首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用using namespace std; 为什么会有内存泄漏?解决思路

2012-02-25 
用using namespace std 为什么会有内存泄漏?#includecrtdbg.h#includeiostream //usingnamespacestd

用using namespace std; 为什么会有内存泄漏?
#include   <crtdbg.h>
#include   "iostream "                     //
using   namespace   std;                       //#include   <iostream.h>
void   main()
{
_CrtDumpMemoryLeaks();
}

//Debug   Info:
Detected   memory   leaks!
Dumping   objects   ->
{46}   normal   block   at   0x00371068,   33   bytes   long.
  Data:   <   C                             >   00   43   00   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD  
{45}   normal   block   at   0x00371000,   40   bytes   long.
  Data:   <     C                           >   EC   11   43   00   16   00   00   00   00   00   00   00   00   00   00   00  
Object   dump   complete.


而且如果main函数中进行了内存的操作,内存泄漏更多。如下:


void   main()
{
int   n   =   10;
int   num;
cin> > num;
int   *p   =   new   int[sizeof(int)*num];
int   *q   =   p;
p   =   &n;
delete   q;
q   =   NULL;
_CrtDumpMemoryLeaks();
}


//Debug   Info:
Detected   memory   leaks!
Dumping   objects   ->
{69}   normal   block   at   0x00372BE0,   5   bytes   long.
  Data:   <true   >   74   72   75   65   00  
{68}   normal   block   at   0x00372B98,   6   bytes   long.
  Data:   <false   >   66   61   6C   73   65   00  
{67}   normal   block   at   0x00372B50,   1   bytes   long.
  Data:   <   >   00  
{62}   normal   block   at   0x003727A8,   24   bytes   long.
  Data:   <     F           P+7   .       >   F8   F2   46   00   01   00   00   00   50   2B   37   00   2E   00   CD   CD  
{56}   normal   block   at   0x00372760,   8   bytes   long.
  Data:   <     F           >   A8   F2   46   00   01   00   00   00  
{53}   normal   block   at   0x00372838,   512   bytes   long.
  Data:   <                                 >   20   00   20   00   20   00   20   00   20   00   20   00   20   00   20   00  
{48}   normal   block   at   0x003710D0,   24   bytes   long.
  Data:   <T   F                           >   54   F2   46   00   01   00   00   00   00   00   00   00   00   00   00   00  


{46}   normal   block   at   0x00371068,   33   bytes   long.
  Data:   <   C                             >   00   43   00   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD  
{45}   normal   block   at   0x00371000,   40   bytes   long.
  Data:   <4   F                           >   34   F2   46   00   16   00   00   00   00   00   00   00   00   00   00   00  
Object   dump   complete.

如果把#include   "iostream "   using   namespace   std;换成#include   <iostream.h> 就没有内存泄漏检测到是怎么回事?在网上没有找到相关的东西,哪位达人帮忙解释一下。

[解决办法]
因为你测试方法错误!!!
全局变量要在main返回后才析构,才归还内存。
靠_CrtDumpMemoryLeaks()来检测内存泄露,基本是搞笑级行为。
用专用工具如purify等来做这个事。
[解决办法]
那为什么修改头文件后不会出现问题呢?
[解决办法]
有管怎么程序写的怎么样,用using namespace std;会产生内存泄露是肯定不可能的了

库都是些牛人写的,还用了这么久,怎么可以出现问题,就算可能有问题,咱们一般也遇不到


呵呵


大家一起努力学习提高...
[解决办法]
这应该是VC6的问题。
因为VC6的标准库头文件是根据非标准的头文件改写过来的,如VC6先用非标准的方式实现了 <iostream.h> ;后来为了与标准一致,又制作了 <iostream> 和名字空间std,底层调用了 <iostream.h> 。因此,可能是标准头文件的制作匆忙有疏忽,也可能是因为先期完成的编译器和标准头的一些功能不适配、导致标准头的实现采取了某些妥协的方式,从而造成内存泄漏。总之,VC6的 <iostream> 很有可能确实是有问题的。

在VS2005(VC8)中试了一下,完全没有内存泄漏。
[解决办法]
楼主如果用的 vc2005, 记得打上sp1, vc2005的 <iostream> 里面的确有内存泄露,打上sp1就没有了。

不过楼主的问题,不像,可以试一下。
[解决办法]
而且如果main函数中进行了内存的操作,内存泄漏更多。如下:


void main()
{
int n = 10;
int num;
cin> > num;
int *p = new int[sizeof(int)*num];
int *q = p;
p = &n;
delete q; // 你申请了一个整型数组的内存,只释放了一个整型的内存,当然会多了
q = NULL;
_CrtDumpMemoryLeaks();
}

======================================
这段代码本来就有内存泄露的!

热点排行