立即注册 登录
VB爱好者乐园(VBGood) 返回首页

admin6677的个人空间 http://blog.vbgood.com/?110914 [收藏] [复制] [分享] [RSS]

日志

内存泄漏和数组参数时要清除在 MTS 方法对象不起作用

热度 1已有 1105 次阅读2012-10-26 17:17 |个人分类:技术类| 内存, 泄漏

来源:http://msdn.microsoft.com/zh-cn/library/t55h1eas(v=vs.110).aspx

解决方法
最简单的解决方法是使用后期绑定 ;这是声明为对象而不是特定的类类型对象。若要在 Visual Basic 中执行此操作,请更改您在其执行的方法的对象变量的Dim语句。而不是:
Dim oTest As TestArray.Test

使用此选项:
Dim oTest As Object

请注意,此方法可避免清洗参数和内存泄漏。

如果这不是数组的一个有效的解决方法,在方案中另一个解决方案是数组的将作为参数传递不实数数组本身的副本。
若要实现此目的,数组的一个副本,并将其作为调用参数。如果发生错误,只复制已被破坏,您仍有原始数据。但是,在这种情况下内存泄漏问题仍然出现。

如果在方法调用中不出现任何错误,并且预期要修改此数组的内容的服务器,然后将参数数


重现问题的步骤
创建一个 ActiveX DLL。"TestArray"的项目名称和名称的默认类提供的"测试"。
添加一个方法,如下所示:
Public Sub CleanMyArray(RaiseAnError As Boolean, Data() As String)
    If RaiseAnError Then Err.Raise 1234
End Sub
编译的 DLL,并在 Windows 资源管理器中找到它。在 Microsoft 事务服务器中创建新的空包和执行将 DLL 拖到组件右窗格,以注册 MTS.的 TestArray.Test 对象
创建 Visual Basic 6.0 标准 EXE 测试客户端。通过从项目菜单中选取参照,并检查 TestArray 项添加到 TestArray 的类型库的引用。这使您可以声明为属于相应的类的对象引用和使用早期绑定。
在 Form1 窗体上创建按钮并将下面的代码添加到其 Click 事件处理程序:

On Error Goto ErrHandler
    Dim oTest As TestArray.Test
    
    Dim aData(1 to 2) As String
    aData(1) = "vee-bee"
    aData(2) = "edjez"

    Set oTest = New TestArray.Test

    'No error is raised.
    oTest.CleanMyArray False, aData

    MsgBox "OK! aData(1) = """ & aData(1) & """"

    'Now you raise an error: 
    oTest.CleanMyArray True, aData


Cleanup:
    Set oTest = Nothing

Exit Sub
ErrHandler:
    MsgBox "ERROR! aData(1) = """ & aData(1) & """"
    Resume Cleanup

运行该项目。请注意两个消息框。一个显示内容可以接受的另一个显示数组内容被清除。
若要解决此问题,请通过声明测试变量作为对象来使用后期绑定。下面是类似的代码实现此,请注意只有修改Dim语句。

On Error Goto ErrHandler
    Dim oTest As Object 
    'We do this instead of TestArray.Test to use late binding
    
    Dim aData(1 to 2) As String
    aData(1) = "vee-bee"
    aData(2) = "edjez"

    Set oTest = New TestArray.Test

    'No error is raised:
    oTest.CleanMyArray False, aData

    MsgBox "OK! aData(1) = """ & aData(1) & """"

    'Now we raise an error 
    oTest.CleanMyArray True, aData


Cleanup:
    Set oTest = Nothing

Exit Sub
ErrHandler:
    MsgBox "ERROR! aData(1) = """ & aData(1) & """"
    Resume Cleanup

在运行此代码时,请注意该数组的内容保持不变。如果您看一下包 MTX.exe 实例使用 Windows NT 性能监视器请注意在这种情况下没有任何泄漏或者专用字节数。

路过
1

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

发表评论 评论 (1 个评论)

回复 acme_pjz 2012-10-27 15:54
VB6竟有如此严重的内存泄漏Bug??

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-9-18 15:15

VB爱好者乐园(VBGood)
返回顶部