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

Memory management Visual Basic 6 COM中应用程序变量会话副本的内存使用情况,memory-management,multidimensional-array,com,vb6,global-variables,Memory Management,Multidimensional Array,Com,Vb6,Global Variables,我相信在我之前的帖子中,我的问题草拟得不够清楚 我的问题与旧技术有关。然而,得到一个完整的答案对我来说很重要。VisualBasic专家能否回答我的问题,或者提供指向其他网站的链接,并阐明这个内存使用问题 考虑电子商务站点页面上自定义COM plus对象中的以下VB 6代码: 为globalArray元素指定长字符串和短字符串。此外,globalArray的某些元素具有较小的阵列 并加载xml: Dom globalArray(30, 100000) Set objGlobalDom = Cr

我相信在我之前的帖子中,我的问题草拟得不够清楚

我的问题与旧技术有关。然而,得到一个完整的答案对我来说很重要。VisualBasic专家能否回答我的问题,或者提供指向其他网站的链接,并阐明这个内存使用问题

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

为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”) 
该应用程序(“objGlobalDom”)将包含一个约1000个节点的xml,每个节点占用约3k的内存。该阵列将占用大约50兆内存

考虑到VB6和COM对象:

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

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

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


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

COM对象只是UDT“用户定义类型”(structs int c,delphi中的记录)。它包含指向函数的指针,以及与对象的每个实例相关的私有数据


当您在VB中看到关键字
set
时,并不意味着它将所有数据从var复制到var,它只是复制其引用(地址)并将一个添加到该对象的refcount。当您执行test var=nothing时,对象将不会被释放,直到refcount达到0。因此,设置Obj=Nothing会使对象RefCount递减,如果RefCount=0,则对象会自动释放。

感谢您的回答。虽然我知道对象引用,但我对对象的数据部分仍然感到困惑。尽管修改后的会话变量的数据是对应用程序变量数据的引用,但对会话变量数据的修改如何不会自动反映到应用程序变量的数据中?或者,如果我们在会话变量中修改的不是应用程序变量中的实际数据,那么我们在会话变量中修改什么?会话变量如何不为数据占用额外内存?谢谢你可能的副本