"自由功能的作用"在C通用数据结构实现中

时间:2017-01-20 04:19:21

标签: c

我在C上编写通用数据结构实现用于学习目的(使用void指针),但是我对#34;自由函数"的作用感到有些困惑。几乎所有通用实现都允许用户传递给初始化函数。

我们说我有一个堆栈。当客户端调用" pop"时,我应该调用用户提供的免费功能吗?例如,操作?从一方面来看,如果我们在访问它之后释放元素,并在将其返回给调用者之前,当调用者接收到访问该内存的值时将是未定义的行为,但是如果我们不删除它,则用户将负责这样做,首先打败传递自定义免费功能的目的。

这里的最佳做法是什么?

3 个答案:

答案 0 :(得分:0)

你总是需要知道如何销毁外部创建的对象以避免内存泄漏。

对于您的堆栈示例,如果用户推送对象然后销毁堆栈会发生什么?堆栈析构函数应该调用它仍然包含的所有元素的析构函数。

答案 1 :(得分:0)

  

假设我有一个堆栈。我应该免费给用户打电话吗?   当客户端调用“pop”操作时,例如?

不,当它从堆栈中弹出时,你不应该释放它。用户期望得到他早先在堆栈上推送的对象。当然,它必须是有效的。 在弹出操作期间,您只应释放存储用户对象所需的数据。

  

我对“自由功能”的作用感到有点困惑   几乎所有通用实现都允许用户传递给   初始化函数。

我所知道的自定义免费功能仅在整个管理数据结构被销毁时使用。然后,除了列表节点等管理数据之外,还必须释放用户数据。

由于您不知道该用户数据中是否包含动态分配的对象需要一些额外的处理,因此您只能将其留在用户手中。 为此,用户必须传递一个免费功能。

答案 2 :(得分:0)

为了安全起见,您应该始终拥有一个专门用于释放您在程序中编辑的所有内容的功能。你最后可以做到这一点,或者只是当你确定在那之后 需要它时。