C99:从堆中释放后返回一个值

标签 c return queue free c99

我想知道是否有一种方法可以在它从堆中释放之前返回一个值。

我的问题是,如果我这样做:

queue_item *dequeue(queue *this) {
   node old = this->front;
   this->front = old->link;
   free(old->item);
   free(old);
   return(old->item);
}

很明显 old->item 在返回之前被从堆中取出。目前为了解决这个问题,我存储了以前在字段中使用的项目。然后我在下次出列时释放该项目。最后,我终止了队列析构函数中的最后一项。

queue_item prev_item;
queue_item *dequeue(queue *this) {
   assert (!queue_isempty (this));
   node old = this->front;
   this->front = old->link;
   queue_item item = old->item;
   free(prev_item);
   prev_item = old->item;
   free(old);
   return(old->item);
}

void queue_destruct(queue this) {
   free(prev_item);
   free(this)
}

但我对这种方法不太满意,因为我总是在堆上有一个额外的项目。有没有解决的办法?我是否缺少某种优雅的解决方案?

最佳答案

你不应该在它仍然需要的时候释放它。一旦它不存在,你永远不应该把它留在堆上。

您可以做的是抽象出如何创建它以及如何销毁它的细节。但你不能欺骗时间。您需要知道何时 创建和何时 销毁它的东西。您需要知道如何创建和如何销毁它的东西。这两件事不必是同一件事。一个可以调用另一个。但不要在没有考虑何时销毁的情况下要求创建。

请记住,在内存中移动大数据代价高昂且通常毫无意义。请记住,您不会指定某些东西的分配位置,您会被告知。一旦分配了一些东西,您就可以共享该地址。但作为请求分配它的东西、级别,这是你自己清理的工作。

这是仅靠一个函数无法做到的事情。你需要两个。每个时刻一个。

如果您处于其他事物要求您创建它的级别,您可以让它告诉您何时销毁它。正是在这两个时刻之间,您可以及时交出地址并让上面的东西使用它。那个东西现在负责要求你清理。

这就是人们所说的malloc和free需要成对使用的意思。您分配的任何资源也是如此。

关于C99:从堆中释放后返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23861199/

相关文章:

c - 无法通过函数将值放入字符串数组或字符串指针中

Angular 2 Observable Service 从 localStorage 返回数据

c++ - C++ 中的链表排序

queue - 我如何在 SML/NJ 中使用 Queue 库

目录监视器的c程序

c# - 错误 : returns void, return 关键字后面不能跟对象表达式

将毫秒转换为 time_t

java - 使用 IBM MQ 类浏览、读取和删除队列中的消息

将 llvm .bc 文件转换为人类可读的 .ll 文件

c - 在 C 中将浮点 16 位数转换为 4 位整数的最有效方法