2014-09-26 43 views
0

我正在使用MEMORYSTATUSEX.ullTotalVirtual和MEMORYSTATUSEX.ullAvailVirtual之間的區別來顯示系統上使用的虛擬內存。MEMORYSTATUSEX和GlobalMemoryStatusEx

如果這個數字(兩個成員之間的差異)隨着我的應用程序執行時間不斷增加,這是否表示內存泄漏?

我對此有些懷疑,但希望對此有所貢獻。

多次調用:: SystemTimeToFileTime似乎導致此數字隨着時間的推移而增加。

UPDATE:

bool f (const SYSTEMTIME& sysTime, UINT64* localTime) 
{ 
    FILETIME f; 
    if (!SystemTimeToFileTime (sysTime, &f)) 
     return (false); 
    *localTime = (static_cast <UINT64> (f.dwHighDateTime) << 32) | f.dwLowDateTime; 
    return (true); 
} 

當我執行這個功能很多次,它會導致MEMORYSTATUSEX.AvailVirtual減少。我沒有注意到這個過程中的任何性能問題,這讓我相信這不是內存泄漏。但我不明白爲什麼這會導致可用的虛擬內存減少。如果我註釋掉這個函數,那麼ullAvailVirtual不受影響。

我正在運行Windows 7 32位。但是,我的同事在Windows 7 64位上看到了相同的行爲。

+0

不,這並不表示泄漏。並且SystemTimeToFileTime不能泄漏。 – 2014-09-26 21:29:26

+0

那麼,爲什麼該函數會導致進程「虛擬」虛擬內存。 IOW,這是什麼指示? – rohitsan 2014-09-26 22:51:41

+0

我懷疑它是否被盜。如果您想獲得詳細的幫助,請展示您的代碼。 – 2014-09-27 05:53:35

回答

1

該問題在您的程序中的其他地方。以下程序(包括對您的f函數的錯誤修復)無論停留多久,都會一次又一次顯示相同的值。

#include <windows.h> 
#include <stdio.h> 

bool f (const SYSTEMTIME& sysTime, UINT64* localTime) 
{ 
    FILETIME f; 
    if (!SystemTimeToFileTime (&sysTime, &f)) 
     return (false); 
    *localTime = (static_cast <UINT64> (f.dwHighDateTime) << 32) | f.dwLowDateTime; 
    return (true); 
} 

int __cdecl main(int, char**) 
{ 
    SYSTEMTIME st; 
    GetSystemTime(&st); 

    for (;;) { 
     UINT64 result; 
     for (int i = 0; i < 10000000; i++) f(st, &result); 

     MEMORYSTATUSEX info = { sizeof(info) }; 
     GlobalMemoryStatusEx(&info); 
     printf("%I64d\n", info.ullTotalVirtual - info.ullAvailVirtual); 
    } 
} 

還要注意,打印的值不是系統正在使用的虛擬內存。這是您的進程正在使用的地址空間量。具體而言,你減去這些值

ullTotalVirtual

調用進程的虛擬地址空間的用戶模式部分的大小,以字節爲單位。

ullAvailVirtual

的未預留和未提交存儲器目前在調用進程, 以字節爲單位的虛擬地址空間的 用戶模式部分的量。

這是在說虛擬地址空間,而不是虛擬內存。

+0

噢,對不起,遺忘了sysTime之前的&(它實際上就是這樣的實際功能 - 我沒有直接訪問代碼並從我的[錯誤]內存中寫入)。 – rohitsan 2014-09-27 17:50:40

+0

謝謝。這正是我所懷疑的。 – rohitsan 2014-09-27 18:16:37