2013-07-30 14 views
-4

操作系统何时释放内存?当我使用性能计数器时,我没有看到它被删除。请参阅下面的代码。 分配之前的内存使用情况和解除分配之后的内存使用情况之间的差异应该是0但不是。 基本上,我有一个DLL DLL宿主泄漏内存(32位MS-OS超过2GB)。 需要紧急帮助。如何确保内存泄漏被关注?

  #include "stdafx.h" 
     #include <stdlib.h> 
     #include <crtdbg.h> 
     #include <list> 
     #include <map> 



     //#define _CRTDBG_MAP_ALLOC 
     #include <stdlib.h> 
     #include <crtdbg.h> 

     using namespace std; 
     /* 
     #ifdef _DEBUG 
      #ifndef DBG_NEW 
       #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
       #define new DBG_NEW 
      #endif 
     #endif // _DEBUG 
     */ 
     template <class K, class T, class Pr = less<K>, class A = allocator<T> > 
     class CTypedHeapPtrMap : public map<K, T, Pr, A > 
     { 
     public: 
      // Construction 
      CTypedHeapPtrMap() 
      { 
      }; 

      // Destructor 
      ~CTypedHeapPtrMap() 
      { 
       DeleteContents(); 
      }; 

      void DeleteContents() 
      { 
       iterator ItEntry; 

       /* Empty the list and delete memory */ 
       ItEntry = begin(); 
       while (ItEntry != end()) 
       { 

        T pT = ItEntry->second; 
        delete[] pT; 
        pT = NULL; 
        ItEntry++; 
       } 
       map<K,T,Pr,A>::clear(); 
      }; 
     }; 

     typedef CTypedHeapPtrMap<long, char*>     VALIDATION_MAP; 

     int _tmain(int argc, _TCHAR* argv[]) 
     { 
      PROCESS_MEMORY_COUNTERS_EX pmcx = {}; 

      pmcx.cb = sizeof(pmcx); 
      GetProcessMemoryInfo(GetCurrentProcess(),reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 

      //assumuing GetProcessMemoryInfo call above allocates some memory. So get the memory status again 
      pmcx.cb = sizeof(pmcx); 
      GetProcessMemoryInfo(GetCurrentProcess(),reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 
      printf(" Memory usage (Before allocation) = %ld\n", pmcx.WorkingSetSize); 

      { 
       VALIDATION_MAP pStr; 

       char *ptr1 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(1, ptr1)); 
       char *ptr2 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(2, ptr2)); 
       char *ptr3 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(3, ptr3)); 
       char *ptr4 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(4, ptr4)); 
       char *ptr5 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(5, ptr5)); 
       char *ptr6 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(6, ptr6)); 
       char *ptr7 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(7, ptr7)); 
       char *ptr8 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(8, ptr8)); 
       char *ptr9 = new char[10000]; 
       pStr.insert(VALIDATION_MAP::value_type(9, ptr9)); 
      } 
      pmcx.cb = sizeof(pmcx); 
      GetProcessMemoryInfo(GetCurrentProcess(),reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 
      printf(" Memory usage (After de-allocation) = %ld\n", pmcx.WorkingSetSize); 
      Sleep(60000);//sleep for a minute 
      return 0; 
     } 
+3

简单:只是不创建泄漏 – ckv

回答

0

该系统使用该存储器中的程序之后将解除分配的存储器被终止时,即,在主的return 0之后。当您调用GetProcessMemoryInfo函数时,内存还没有被释放,因此内存使用量在应该为零时存在很大差异。系统实际上是在你的程序结束之后重新分配内存(它总是这样做)。

但是,你不应该觉得你在清澈的时候,你说,泄漏的2GB内存,了很多,我非常非常怀疑你的程序需要那么多的内存来运行。你真的应该考虑在你的代码中寻找空间来释放内存以用于未被使用的变量。

+0

VALIDATION_MAP PSTR是走出去的范围,因此析构函数被调用。那个时候操作系统是不是会释放内存? – Yogesh

+0

VALIDATION_MAP pStr超出范围,因此析构函数被调用。那个时候操作系统是不是会释放内存?关于2 GB内存问题 - 我有一个C++代码,它可以根据某种优化来计算某些内容。优化是在一个递归函数中进行的。该函数根据需要在堆上分配内存。析构函数假设释放它。这个特定的DLL托管在dllhost中,代码是多线程的。因此,如果操作系统只在程序退出后才释放,那么对我来说就没有好处。 – Yogesh

+0

你真的不应该依靠操作系统为你分配内存,永远。 C和C++是低级别的,而且功能非常强大,因此您应该注意分配和释放自己,它只保证在程序退出后内存将被释放 – Optox