读书人

用using namespace std; 为什么会有内

发布时间: 2012-02-25 10:01:48 作者: rapoo

用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();
}

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

读书人网 >C++

热点推荐