应用程序变量的会话副本的内存使用情况在Visual Basic 6 COM中

时间:2015-11-14 00:43:31

标签: memory-management multidimensional-array com vb6 global-variables

我相信我之前的帖子中没有清楚地草拟我的问题。

我的问题与旧技术有关。然而,通过回答对我来说很重要。 Visual Basic专家可以回复我或包含其他网站的链接,并阐明这个内存使用问题吗?

在电子商务网站页面上的自定义COM加上对象中考虑以下VB 6代码:

将long和short字符串分配给globalArray元素。此外,globalArray的一些元素包含较小的数组。

并加载xml:

Dom globalArray(30, 100000) 
Set objGlobalDom = CreateObject("msxml2.FreeThreadedDomDocument.6.0")
objGlobalDom.loadXML (xmlStr) 
Application.lock 
    Set Application(“objGlobalDom”) = objGlobalDom 
    Application(“globalArray”) = globalArray 
Application.unlock

对于任何新会话,都会完成以下变量分配:

set Session(“objGlobalDom”) = Application(“objGlobalDom”) 
session(“globalArray”) = Application(“objGlobalDom”) 

Application(“objGlobalDom”)将包含一个包含大约1000个节点的xml,每个节点占用大约3k的内存。该阵列将占用大约50兆的内存。

考虑VB6和COM对象:

我知道对象的每个实例都引用了对象的数据。我不明白的是:

1-如果Session(“objGlobalDom”)不包含Application的副本(“objGlobalDom”),为什么Session(“objGlobalDom”)的数据更改不会自动反映在Application的数据中(“objGlobalDom”) “)或会话(”objGlobalDom“)是否有应用程序的副本(”objGlobalDom“)?

2-根据Microsoft的说法,在我的globalArray示例中,Session(“globalArray”)总是获取Application(“globalArray”)的副本,因此Microsoft不鼓励将数组分配给会话变量。但是我不清楚在COM对象和对象引用的情况下,set Session(“objGlobalDom”)= Application(“objGlobalDom”)的赋值是否将数组复制到会话变量?

我非常感谢您的回答,并提前感谢您的回复。

1 个答案:

答案 0 :(得分:0)

COM对象只是UDT'用户定义的类型' (结构int c,在delphi中记录)。保存指向函数的指针,以及与对象的每个实例相关的私有数据。

当你在VB中看到关键字set时,它并不意味着它会将所有数据从var复制到var,它只是复制它的引用(地址)并将一个加到该对象的引用计数中。当你测试var = nothing时,在refcount达到0之前不会释放对象。所以设置Obj = Nothing减少Object RefCount,如果RefCount = 0则是Object Freeself。