我相信我之前的帖子中没有清楚地草拟我的问题。
我的问题与旧技术有关。然而,通过回答对我来说很重要。 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”)的赋值是否将数组复制到会话变量?
我非常感谢您的回答,并提前感谢您的回复。
答案 0 :(得分:0)
COM对象只是UDT'用户定义的类型' (结构int c,在delphi中记录)。保存指向函数的指针,以及与对象的每个实例相关的私有数据。
当你在VB中看到关键字set
时,它并不意味着它会将所有数据从var复制到var,它只是复制它的引用(地址)并将一个加到该对象的引用计数中。当你测试var = nothing时,在refcount达到0之前不会释放对象。所以设置Obj = Nothing减少Object RefCount,如果RefCount = 0则是Object Freeself。