我正在尝试创建自己的int堆栈(struct int_stack),它是我创建的struct(struct is_node)的链接列表。我想这样做没有发生内存泄漏,但我无法弄清楚如何实现pop方法。 pop方法接受参数(int_stack)并返回一个int。假设node_capacity设置为5,堆栈中有6个int(意味着2个节点),一个已满,另一个只有一个int,并且调用pop。它应该只返回节点上int的值,但是它需要释放节点上的int数组并释放节点。我不确定如何释放int,然后返回它,而不会导致内存泄漏。这就是我想要的:
struct is_node {
int *contents;
int next_index;
struct is_node *next;
};
struct int_stack {
int size;
int node_capacity;
struct is_node *head;
};
我的结构被定义为:
Private Sub checkout_cmdbutton_Click()
Dim ws As Worksheet, r As ListObject, foundcell As Range
Set ws = Worksheets("Renting Logs")
Set r = ws.ListObjects("RentLogs")
Const WHAT_TO_FIND As Integer = 200
Set foundcell = r.ListColumns("ID").DataBodyRange.Find(What:=WHAT_TO_FIND)
If Not foundcell Is Nothing Then
MsgBox (WHAT_TO_FIND & " found in (" & foundcell.Row & "," & foundcell.Column & ")")
r.ListColumns("Check in Date").Range(foundcell.Row - r.HeaderRowRange.Row + 1).Value = Me.checkin_datepicker.Value
Else
MsgBox (WHAT_TO_FIND & " not found in RentLog")
Exit Sub
End If
End Sub
'clear userform
Me.checkin_datepicker.Value = Date
'close userform
Unload Me
End Sub
答案 0 :(得分:0)
在这种情况下,您的返回值pop_val不会泄露。作为局部变量,它在堆栈上分配,而不是堆,不需要释放。
答案 1 :(得分:0)
你想要动态分配释放堆栈节点的东西。
现在让我们考虑设计有两个部分: -
您正在创建一个头节点,它基本上会存储有关列表以及列表开头的所有元信息。
在您使用动态创建的数组之前。现在让我们更仔细地研究一下。要删除堆栈节点(堆栈节点),您必须删除整个已分配的contents
并创建包含所有其他元素的新节点。这是一种方式,但是为每个pop等分配deallocating效率非常低。
如何改变设计呢?
保留头节点。然后保留stack-node*
。现在每次推送时,创建一个新的堆栈节点,然后将其添加到head
。同样,弹出时只需从head
删除该节点。无需保留阵列。只需将数据放在单独的节点中就可以了。这将使您的代码变得非常简单。