当一个函数有很多"回报"时,如何在'return'之前总是做同样的事情?

  • 本文关键字:return 一个 函数 回报 c++
  • 更新时间 :
  • 英文 :


我有一个大函数,它在堆内存中分配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
}

它可能不是最快的代码,但它符合一个入口和一个出口的标准。

相关内容

最新更新