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

时间:2014-05-26 00:21:13

标签: 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->项目在被返回之前从堆中取出。目前为了解决这个问题,我存储以前在字段中使用的项目。然后我在下次出列时释放该项目。最后,我杀死了队列析构函数中的最后一项。

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)
}

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

1 个答案:

答案 0 :(得分:1)

在它仍然需要时,你永远不应该free它。一旦不存在,你就不应该把它留在堆上。

你可以做的是抽象出如何创建它以及如何销毁它的细节。但你不能欺骗时间。你需要知道何时来创建 来销毁它。您需要知道如何创建的内容以及如何来销毁它。这两件事情不一定是一回事。一个人可以打电话给对方。但是,不要在不考虑何时销毁的情况下请求创作。

请记住,在内存中移动大量内容是昂贵的,而且往往毫无意义。请记住,你没有指定分配的东西,你会被告知。分配完成后,您可以共享该地址。但是,作为事情,要求分配它的水平,你的工作是你自己清理。

这是你根本无法用一个功能做的事情。你需要两个。每个时刻都有一个。

如果你处在一个其他东西要求你创建它的水平上,你就可以告诉你什么时候去摧毁它。在这两个时刻之间你可以提交地址并让你上面的东西使用它。那件事现在要求你清理。

当人们说malloc和free需要成对使用时,这就是人们的意思。您分配的任何资源都可以这样说。