C++删除数组,即使发生错误也是如此
C++ delete array even if error occurs
我是C++新手,来自C#。这是代码:
void function(int n)
{
double* array = new double[n];
//some work that can return or throw an exception
//...
delete[] array;
return;
}
我知道C++中没有等效的 C# using
。
有没有一种简单而优雅的方法来确保内存在发生时都会释放?
在C++中,代码如下所示:
#include <vector>
void function()
{
std::vector<double> array(100);
//some work that can return when or throw an exception
//...
return;
}
如果你真的不想初始化数组元素,不需要调整数组大小,也不需要迭代器,你也可以使用:
#include <memory>
void function()
{
std::unique_ptr<double[]> array(new double[100]);
//some work that can return when or throw an exception
//...
return;
}
在这两种情况下,您都可以使用 array[0]
、array[1]
等访问数组元素。
最后,如果你不需要将数据的所有权从函数中转移出去,在编译时知道数组的大小,并且大小不要太大,你也可以考虑有一个直接数组对象:
void function()
{
double array[100]; // uninitialized, add " = {}" to zero-initialize
// or:
std::array<double, 100> array; // ditto
//some work that can return when or throw an exception
//...
return;
}
自动变量在作用域结束时自动销毁,无论是由于返回还是抛出:
{
double array[100];
throw 1; // no memory leaked
}
很抱歉提供误导性示例,编译时数组的大小未知
在这种情况下,您确实需要一个动态数组。处理资源清理(如动态内存)的一种流行解决方案是将指针(或句柄或描述符,取决于资源类型)包装在一个类中,该类在初始化时获取资源,并在销毁时释放。然后,您可以创建此包装器类型的自动变量。此模式称为"资源获取即初始化"或简称 RAII。
但是,您无需为动态数组编写自己的 RAII 包装器。标准库为您提供: std::vector
相关文章:
- "错误:数组下标的无效类型'float [10001][float]'是什么意思?
- 错误:数组下标的类型"const bool[int]"无效
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 使用GCC 4.8构建错误:数组用作初始化器
- 如何修复问题中的"teminated due to timeout"错误 数组操作 |黑客兰克?
- | 9 |错误:非静态数据成员'matrix :: row'| 9 |错误:数组绑定不是在']']'令牌|之前的整数常数
- 错误:数组的总大小不得超过0x7fffffff字节
- 错误:无法将参数“1”的“double*”转换为“double”,错误:数组下标的类型“double[double]”无
- 返回并强制转换数组指针(错误:数组下标的类型..无效)
- 返回c++中的字符错误数组
- VC++错误:数组实例化的大小来自模板化的静态常量
- c++mex错误:数组下标的类型“double[mwSize]”无效
- 错误数组用作初始值设定项,我不知道错误
- 编译错误 - 数组下标'char[int]'的类型无效
- 向量在我的类中.错误:数组new [-fpermissive]中的圆括号初始化项
- 错误:数组下标的类型无效
- 错误:数组new中的size必须是整型[-fpermissive]
- 错误:数组下标的“Pixel*[__complex__ int]”类型无效
- c++错误数组显示
- C++:错误:数组下标的类型“size_t{aka long unsigned int}[size_t{aka long