处理vb6对象--一个令人惊讶的问题。

问题描述 投票:0回答:1

我在vb6中 "发明 "了一个linked-list技术,在对象内部放置一个指针。

Class FooBar:
Public ptr As FooBar

现在,我只需在对象内部放置一个指向列表头部的指针。Head.ptr 指向下一个对象。Head.ptr.ptr 指向下一个对象,等等。

当我想销毁列表时,我只需使用 Set Head = Nothing这将导致清空Head.ptr,进而触发清空Head.ptr.ptr等,导致一个空列表(实际上我是通过在Class_Terminate事件中放置一个断点来检查的)。

这样做很好,也很整洁,直到我在列表中拥有大约10,000个对象。现在这行 Set Head = Nothing 导致 "Out of stack memory "错误,之后IDE崩溃。

原来,vb6是递归地清除对象的(即使我没有Class_Terminate事件也会发生)。

所以我想我应该 "手动 "销毁这个列表,用某种循环来销毁,但我想不出一个办法,因为在循环中使用指针并将其设置为Nothing......什么都不做,因为它给对象添加了Ref!我应该怎么做?

我应该怎么做?

vb6
1个回答
1
投票

我终于找到了一个手动销毁列表的方法。

一个有点棘手但可行的解决方案。

我首先在类中添加一个小方法,在不删除对象的情况下清除内部指针。

Class FooBar:
Public ptr As FooBar

Public Function SafeRemove() As FooBar
Set SafeRemove = ptr
Set ptr = Nothing
End Function

在一个模块中。

Sub ClearList()
While Head Is Nothing = False
    Set Head = Head.SafeRemove
Wend
End Sub

0
投票

我可以理解为什么你会得到一个堆栈溢出。你隐含地调用了IUnknown接口的Release()方法,它们调用了VB内部的destroy方法,清除了所有的内部状态,包括指向下一项的变量,然后调用Release(),等等,等等。

为了绕过堆栈溢出的问题,你最好实现一个双链接的列表,并且总是保存一个指向列表末端的指针。但这样一来,你现在就会出现循环引用的问题,除非你有特定的处置方法,否则什么都清不下来。

你不妨使用VBA.Collection对象,有人告诉我(在《Hardcore Visual Basic》一书中)。 内部双重链接的列表)。)

© www.soinside.com 2019 - 2024. All rights reserved.