用递归和循环(C ++ 20)的管理记忆

问题描述 投票:0回答:1

我的递归函数定义为这样:

void routine(int* old_arr, int k, int depth) {
    if (depth == 15) return;
    int* new_arr = new int[size];
    // some operation that builds new_arr values out of old_arr values
    delete [] old_arr; // if i dont need old_arr anymore, can I just do this?
    for (int i = 0; i < 3; i++) {
        routine(new_arr, k);
    }
    return;
}

如果您会注意到,在for循环的第二个呼叫中,将有一个双人免费。

将此视为深度沿三元树的深度搜索。函数参数old_arr用于填充称为new_arr的新数组的值。请注意,仅需要在下一个深度计算值。如果我没有任何免费的例行程序,那么我将有很多这些指针在消耗记忆周围浮出水面,而没有做任何事情。什么是围绕此的好设计?

我已经考虑过使用类似的东西,然后用

代替

shared_ptr<int>

delete[]
这是正确的主意吗?编辑:实际上也无法正常工作。
    

简而言之,是的,听起来您需要
shared_ptr<int> new_arr(new int[size]); // operators to initialize new_arr with old_arr if (old_arr.use_count() == 1) old_arr.reset()

。 但是您的递归中有些陌生 - 呼叫者需要

shared_ptr
c++ recursion memory-management memory-leaks c++20
1个回答
0
投票
new_arr

三次,因此,永远不应该释放它。 在需要时让呼叫者释放它。 除非您的记忆力很低,并且这些是巨大的缓冲区,否则这不是一个问题。

使用
routine()
而不是
routine()
make_shared
,它可以防止错误的错误,并确保一个堆分配而不是两个(一个用于数组,一个用于共享指针控制块)。  另外,除了调试外,切勿使用
new

。 这是一些修订的代码:

new
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.