【问题标题】:C99: Return a value after it's been free'd from the heapC99:从堆中释放后返回一个值
【发布时间】:2014-05-26 00:21:12
【问题描述】:

我想知道是否有办法在值从堆中释放之前返回它。

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

queue_item *dequeue(queue *this) {
   node old = this->front;
   this->front = old->link;
   free(old->item);
   free(old);
   return(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)
}

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

【问题讨论】:

  • 如果需要返回值不应该是freed

标签: c return queue free c99


【解决方案1】:

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

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

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

这是您仅使用一种功能根本无法做到的事情。你需要两个。每个时刻一个。

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

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

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2021-04-02
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多