void  *  p1;  
//char  *p2;  
//int  *p3;  
//double  *  p4;  
 
p1=new  double;  
delete  p1;  
 
vc没有报错也没有警告,但会不会泄漏内存呢?  
 
把  delete  p1;  改成  delete  (double  *)p1;  心理上觉的安全点但翻遍了我能找到的所有书籍上都没有这种先例。更糟糕的是我这样的菜鸟想尽了各种办法也检测不出到底是否漏了。似乎在集成环境下不能检测出?  
 
VC许多方面总是出人意料,真是怕了。不如TC2那么一目了然呀

解决方案 »

  1.   

    去掉delete  p1;  的提示信息
    F:\试验\dlg17\dlg17Dlg.cpp(401) : {80} normal block at 0x00421340, 8 bytes long.
     Data: <        > CD CD CD CD CD CD CD CD
      

  2.   

    这是C++的范畴的问题,你学C++基础的时候,如果用了比较好的书,里面应该讲到new和delete的细节
      

  3.   

    不会的!
    void  *  p1;
    p1=new  double[20];  
    delete  p1;
    这样才会有内存泄露的
      

  4.   

    告诉你两种方法检测内存是否泄漏:
    1.用BoundsChecker工具检测;
    2.把可疑的代码段放在一个大点的循环里面反复调用,用windows任务管理器监测内存使用情况,也能发现有没有内存泄漏。你上面的代码用两种方法都没有发现有内存泄漏问题。。
      

  5.   

    void  *  p1;
    p1=new double;  
    ...
    delete  p1;如果不是double而是一个自定义的结构体呢?而且不是紧接着new就delete,经过了不知多少行代码,p1的值也换过很多次了甚至又一次被new赋予了一个新的别的类型变量,当最终还是等于原来这个值,delete的时候不会有问题吗?如果不泄漏是由于 new 分配的内存块还有什么不为人知的 属性 保留在程序的某个地方吗?谁有new和delete比较深刻一点的资料啊.
      

  6.   


    void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
    {
    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
    }#if _MSC_VER >= 1200
    void AFX_CDECL operator delete(void* pData, LPCSTR /* lpszFileName */,
    int /* nLine */)
    {
    ::operator delete(pData);
    }
    #endif