我有一个大函数,它在堆内存中分配2个数组,并在许多不同的地方返回多次。每当她返回时,我想为我的2个数组调用delete[]
,而不必在每个return
之前写delete[]
s。
int function(int a)
{
size_t heap_arr1_len{100};
int* heap_arr1{new int[heap_arr1_len]};
size_t heap_arr2_len{200};
int* heap_arr2{new int[heap_arr2_len]};
//I was thinking of something similar to:
struct at_return{
~at_return()
{
delete[] heap_arr1;
delete[] heap_arr2;
}
} at_return;
/*...............
.................
......return 0;*/
/*...............
.....return 10;*/
//ecc.
}
但是有一个编译时错误,我发现一个结构体不能访问包含在。
中的函数的局部变量。为了避免每次在return
之前都要写delete[] heap_arr1;
,delete[] heap_arr2;
,你会怎么做?
不要使用new
手动分配内存,使用std::vector
代替:
size_t heap_arr1_len = 100;
std::vector<int> heap_arr1(heap_arr1_len);
那么你就不需要担心delete
了。
但是像这样使用析构函数实际上是一个好主意,假设不存在合适的包装类。这种技巧被称为瞄准镜保护。这是一个工作实现。
它可能很有用,例如当处理C库时,它不能为类提供析构函数。您可以编写带有析构函数的可重用包装器类,也可以使用作用域保护作为临时解决方案。
#include <memory>
int function(int a)
{
size_t heap_arr1_len{100};
std::unique_ptr<int[]> heap_arr1{new int[heap_arr1_len]};
// Etc
}
如果您需要文件读/写函数的底层指针,请使用heap_arr1.get()。
我使用can_continue
方法,因此只有一个入口和一个出口(MISRA规则)。
首先设置布尔变量:
bool can_continue = true;
模式变成:
if (can_continue)
{
// do some work
// set can_continue to false to return unexpectedly
}
它可能不是最快的代码,但它符合一个入口和一个出口的标准。