我想知道是否有一种方法可以在它从堆中释放之前返回一个值。
我的问题是,如果我这样做:
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/