【发布时间】:2017-10-03 03:47:25
【问题描述】:
我有一个递归搜索算法,我想在每次调用后清理我的指针。但是,我在这么多地方返回,在每个之前都放一个delete 或free 似乎很草率。
有没有更好的方法?我在函数返回时释放它们是否意味着我应该将它们分配在堆栈而不是堆中?
注意这是一个并行搜索(代码中没有显示),但是调用者永远不会在它的孩子之前返回。使用堆栈是否有任何额外的陷阱?
示例代码(这里不用担心算法):
//create a new struct state (using new), initialize and return (C style)
new_state()
free_list(state* node)//free a list
double minimax(state* node, state* bestState) {
if (base_case) {
return;
}
state* gb = new_state(); //single node
state* children = new_state(); //head of list
generate_children(children); //fill list
state* current = children; //traverse node
//recurse on child
double result = -minimax(current, gb);
if (case1) {
free(gb);
free_list(children);
return;
}
if (case2) {
//do stuff
}
while(current != NULL){
result = -minimax(current, gb);
if (case1) {
free(gb);
free_list(children);
return;
}
if (case2) {
//do stuff
}
current = current->next;
}
free(gb);
gb = NULL;
//More stuff (with children but not gb)
free_list(children);
return;
}
【问题讨论】:
-
这就是您使用 RAII 和智能指针的原因。他们清理自己,让您处理逻辑而不是清理。
-
@NathanOliver 我可以自定义智能指针析构函数吗?例如,我需要在退出范围时删除
children指向的整个列表。 -
当然。您可以给他们一个自定义删除器,当它超出范围时将运行该删除器。您也可以只构建一个封装列表的类类型并使用析构函数对其进行清理。如果你这样做了,那么智能指针将在超出范围时调用对象的析构函数。
-
@River,你也可以创建一个宏
scope_exit。我制作了a working version,但它仅适用于当前范围内的一个scope_exit。无论如何,它是 RAII。 -
gb = NULL;-- 函数末尾附近的这行代码不会真正影响任何事情。可以删除。
标签: c++ memory-management heap-memory