没有内存泄漏的堆栈的Pop实现

时间:2017-11-01 16:18:06

标签: c pointers stack pop

我正在尝试创建自己的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

2 个答案:

答案 0 :(得分:0)

在这种情况下,您的返回值pop_val不会泄露。作为局部变量,它在堆栈上分配,而不是堆,不需要释放。

答案 1 :(得分:0)

你想要动态分配释放堆栈节点的东西。

现在让我们考虑设计有两个部分: -

  1. 您正在创建一个头节点,它基本上会存储有关列表以及列表开头的所有元信息。

  2. 在您使用动态创建的数组之前。现在让我们更仔细地研究一下。要删除堆栈节点(堆栈节点),您必须删除整个已分配的contents并创建包含所有其他元素的新节点。这是一种方式,但是为每个pop等分配deallocating效率非常低。

  3. 如何改变设计呢?

    保留头节点。然后保留stack-node*。现在每次推送时,创建一个新的堆栈节点,然后将其添加到head。同样,弹出时只需从head删除该节点。无需保留阵列。只需将数据放在单独的节点中就可以了。这将使您的代码变得非常简单。