gpt4 book ai didi

C++:释放和 "finally"等价物

转载 作者:行者123 更新时间:2023-11-30 01:52:43 25 4
gpt4 key购买 nike

我在一个函数中动态分配一些内存,并且想确保无论是否发生异常都释放它。

显然,如果它在堆栈上,那么 RAII 和堆栈展开会处理它,但我想知道动态分配内存的最佳实践是什么。

例子:

int copyInt(int n) throw(int) { // this function leaves exceptions for the caller to handle
int ret_val;
try {
int *arr = new int[n]; // dynamically allocate some memory for the computation
maybe_throw(arr);
for (int ii=0; ii<n; ++ii) arr[ii]=ii+1; // clever algorithm requiring n ints.
maybe_throw_again(arr);
ret_val = arr[n-1]; // ----"----
} finally { // syntax error, this is what you'd do in Java.
delete arr; // prevent leak, whether exception occurs or not.
}
return ret_val;
}

最佳答案

一般来说,使用smart pointer管理动态分配的对象(或数组)。

通常是 std::unique_ptr<> :它会保证你的对象的破坏,即使抛出异常(出于与你对堆栈分配对象的引用相同的原因:智能指针是动态分配的对象或对象数组的 RAII 包装器)

它同样适用于数组:

1) Manages the lifetime of a single object (e.g. allocated with new)

2) Manages the lifetime of a dynamically-allocated array of objects (e.g. allocated with new[])

在您的代码中:(删除 try/catch/finally 因为清理现在会自动进行)

int copyInt(int n)
{
int ret_val;

std::unique_ptr<int[]> arr = std::unique_ptr<int[]>(new int[n]);
for (int ii=0; ii<n; ++ii)
arr[ii]=ii+1;

return arr[n-1]+1;
}
  • 在您的示例中,您还可以考虑 std::array<>std::vector<>替换 C 风格的数组,但这可能是另一个问题。

关于C++:释放和 "finally"等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24131772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com