2012-06-05 71 views
1

NotesUserActivity類似乎有內存泄漏。當我從多個數據庫收集用戶活動信息並調用GetNthUserActivityEntry方法時,內存使用量隨着每次調用而增加。Useractivity API類內存泄漏

我發現了一些對此問題的引用,但沒有解決方案。我認爲這個問題與此呼叫有關:

' Load the User name for the Activity Structure 
UsernameOffset = puActivity + puActivityEntry.UserNameOffset 
spUsername = Space(MAXUSERNAME) 
Call CopyMemoryString(spUsername, UsernameOffset,Lenb(spUsername)) 
sUserName = Left(spUsername, Instr(spUsername, Chr(0)) - 1) 

回答

2

通過讀取MAXUSERNAME字節(256)從內存中獲取用戶名。用戶名通常不是256個字節,所以我認爲該函數訪問它不應該訪問的內存。

我改變代碼:直到其達到\0

Call CopyMemoryString(spUsername, UsernameOffset, strlenLP(UsernameOffset)) 
Dim sUsername As String 
sUserName = Trim(spUsername) 

strlenLP()的方法讀取存儲器。該聲明是:

Declare Private Function lstrlenLP Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long 
+0

這是否糾正了泄漏?我查看了該類的代碼,雖然我沒有看到任何看起來可疑的東西,但我真的懷疑CopyMemoryString調用可能導致泄漏,因爲它沒有分配任何東西。它將從C API(UsernameOffset)分配的內存複製到由LotusScript運行時爲固定長度字符串(spUsername)分配的內存中。 –

+0

我所做的更改:Lenb(spUsername)變成了strlenLP(UsernameOffset)。對於Lenb(spUsername),CopyMemoryString調用在所有情況下讀取256個字節,使用strlenLP(UsernameOffset)它會返回所有數據,直到\ 0的位置。這不是我懷疑的Copymemorystring本身,它是它被使用的方式。 –

+0

今天在developerWorks上的Notes論壇上有一篇文章,宣佈該課程的新版本。請參閱此處:http://www-10.lotus.com/ldd/nd6forum.nsf/DateAllFlatWeb/BF9AECFB621CC3CD85257A1E000D317B?OpenDocument&ca=drs-fo –

0

這是一個黑暗中的鏡頭,但在我的經驗中,GetNth ... Notes中的方法效率很低。有沒有像使用大多數Notes對象一樣使用GetFirst/GetNext迭代的方法?我會看到如果這有幫助。

+0

這是一個不同的GetNth ...它不是一個標準的Lotus類,而是由http://www.agecom.com.au/useractivity提供的一個類。它基於沙盒中較老的一類。 –