在C ++中的运行时删除数组以节省一些内存

问题描述

我在微控制器上有一个运行C ++ 98版本的C ++脚本(无法升级)。在此脚本中,我需要初始化两个已经存在的元素405的双精度向量。我尝试初始化两个数组:double a[405]= {7.05925826e+07,...};double b [405]= {arr[0],arr[0]*arr[1]...};a[405]的定义如下:

double a[405] = {a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16],a[17],a[18],a[19],a[20],a[21],a[22],a[23],a[24],a[25],a[26],a[0]*a[0],a[0]*a[1],a[0]*a[2],a[0]*a[3],a[0]*a[4],a[0]*a[5],a[0]*a[6],a[0]*a[7],a[0]*a[8],a[0]*a[9],a[0]*a[10],a[0]*a[11],a[0]*a[12],a[0]*a[13],a[0]*a[14],a[0]*a[15],a[0]*a[16],a[0]*a[17],a[0]*a[18],a[0]*a[19],a[0]*a[20],a[0]*a[21],a[0]*a[22],a[0]*a[23],a[0]*a[24],a[0]*a[25],a[0]*a[26],a[1]*a[1],a[1]*a[2],a[1]*a[3],a[1]*a[4],a[1]*a[5],a[1]*a[6],a[1]*a[7],a[1]*a[8],a[1]*a[9],a[1]*a[10],a[1]*a[11],a[1]*a[12],a[1]*a[13],a[1]*a[14],a[1]*a[15],a[1]*a[16],a[1]*a[17],a[1]*a[18],a[1]*a[19],a[1]*a[20],a[1]*a[21],a[1]*a[22],a[1]*a[23],a[1]*a[24],a[1]*a[25],a[1]*a[26],a[2]*a[2],a[2]*a[3],a[2]*a[4],a[2]*a[5],a[2]*a[6],a[2]*a[7],a[2]*a[8],a[2]*a[9],a[2]*a[10],a[2]*a[11],a[2]*a[12],a[2]*a[13],a[2]*a[14],a[2]*a[15],a[2]*a[16],a[2]*a[17],a[2]*a[18],a[2]*a[19],a[2]*a[20],a[2]*a[21],a[2]*a[22],a[2]*a[23],a[2]*a[24],a[2]*a[25],a[2]*a[26],a[3]*a[3],a[3]*a[4],a[3]*a[5],a[3]*a[6],a[3]*a[7],a[3]*a[8],a[3]*a[9],a[3]*a[10],a[3]*a[11],a[3]*a[12],a[3]*a[13],a[3]*a[14],a[3]*a[15],a[3]*a[16],a[3]*a[17],a[3]*a[18],a[3]*a[19],a[3]*a[20],a[3]*a[21],a[3]*a[22],a[3]*a[23],a[3]*a[24],a[3]*a[25],a[3]*a[26],a[4]*a[4],a[4]*a[5],a[4]*a[6],a[4]*a[7],a[4]*a[8],a[4]*a[9],a[4]*a[10],a[4]*a[11],a[4]*a[12],a[4]*a[13],a[4]*a[14],a[4]*a[15],a[4]*a[16],a[4]*a[17],a[4]*a[18],a[4]*a[19],a[4]*a[20],a[4]*a[21],a[4]*a[22],a[4]*a[23],a[4]*a[24],a[4]*a[25],a[4]*a[26],a[5]*a[5],a[5]*a[6],a[5]*a[7],a[5]*a[8],a[5]*a[9],a[5]*a[10],a[5]*a[11],a[5]*a[12],a[5]*a[13],a[5]*a[14],a[5]*a[15],a[5]*a[16],a[5]*a[17],a[5]*a[18],a[5]*a[19],a[5]*a[20],a[5]*a[21],a[5]*a[22],a[5]*a[23],a[5]*a[24],a[5]*a[25],a[5]*a[26],a[6]*a[6],a[6]*a[7],a[6]*a[8],a[6]*a[9],a[6]*a[10],a[6]*a[11],a[6]*a[12],a[6]*a[13],a[6]*a[14],a[6]*a[15],a[6]*a[16],a[6]*a[17],a[6]*a[18],a[6]*a[19],a[6]*a[20],a[6]*a[21],a[6]*a[22],a[6]*a[23],a[6]*a[24],a[6]*a[25],a[6]*a[26],a[7]*a[7],a[7]*a[8],a[7]*a[9],a[7]*a[10],a[7]*a[11],a[7]*a[12],a[7]*a[13],a[7]*a[14],a[7]*a[15],a[7]*a[16],a[7]*a[17],a[7]*a[18],a[7]*a[19],a[7]*a[20],a[7]*a[21],a[7]*a[22],a[7]*a[23],a[7]*a[24],a[7]*a[25],a[7]*a[26],a[8]*a[8],a[8]*a[9],a[8]*a[10],a[8]*a[11],a[8]*a[12],a[8]*a[13],a[8]*a[14],a[8]*a[15],a[8]*a[16],a[8]*a[17],a[8]*a[18],a[8]*a[19],a[8]*a[20],a[8]*a[21],a[8]*a[22],a[8]*a[23],a[8]*a[24],a[8]*a[25],a[8]*a[26],a[9]*a[9],a[9]*a[10],a[9]*a[11],a[9]*a[12],a[9]*a[13],a[9]*a[14],a[9]*a[15],a[9]*a[16],a[9]*a[17],a[9]*a[18],a[9]*a[19],a[9]*a[20],a[9]*a[21],a[9]*a[22],a[9]*a[23],a[9]*a[24],a[9]*a[25],a[9]*a[26],a[10]*a[10],a[10]*a[11],a[10]*a[12],a[10]*a[13],a[10]*a[14],a[10]*a[15],a[10]*a[16],a[10]*a[17],a[10]*a[18],a[10]*a[19],a[10]*a[20],a[10]*a[21],a[10]*a[22],a[10]*a[23],a[10]*a[24],a[10]*a[25],a[10]*a[26],a[11]*a[11],a[11]*a[12],a[11]*a[13],a[11]*a[14],a[11]*a[15],a[11]*a[16],a[11]*a[17],a[11]*a[18],a[11]*a[19],a[11]*a[20],a[11]*a[21],a[11]*a[22],a[11]*a[23],a[11]*a[24],a[11]*a[25],a[11]*a[26],a[12]*a[12],a[12]*a[13],a[12]*a[14],a[12]*a[15],a[12]*a[16],a[12]*a[17],a[12]*a[18],a[12]*a[19],a[12]*a[20],a[12]*a[21],a[12]*a[22],a[12]*a[23],a[12]*a[24],a[12]*a[25],a[12]*a[26],a[13]*a[13],a[13]*a[14],a[13]*a[15],a[13]*a[16],a[13]*a[17],a[13]*a[18],a[13]*a[19],a[13]*a[20],a[13]*a[21],a[13]*a[22],a[13]*a[23],a[13]*a[24],a[13]*a[25],a[13]*a[26],a[14]*a[14],a[14]*a[15],a[14]*a[16],a[14]*a[17],a[14]*a[18],a[14]*a[19],a[14]*a[20],a[14]*a[21],a[14]*a[22],a[14]*a[23],a[14]*a[24],a[14]*a[25],a[14]*a[26],a[15]*a[15],a[15]*a[16],a[15]*a[17],a[15]*a[18],a[15]*a[19],a[15]*a[20],a[15]*a[21],a[15]*a[22],a[15]*a[23],a[15]*a[24],a[15]*a[25],a[15]*a[26],a[16]*a[16],a[16]*a[17],a[16]*a[18],a[16]*a[19],a[16]*a[20],a[16]*a[21],a[16]*a[22],a[16]*a[23],a[16]*a[24],a[16]*a[25],a[16]*a[26],a[17]*a[17],a[17]*a[18],a[17]*a[19],a[17]*a[20],a[17]*a[21],a[17]*a[22],a[17]*a[23],a[17]*a[24],a[17]*a[25],a[17]*a[26],a[18]*a[18],a[18]*a[19],a[18]*a[20],a[18]*a[21],a[18]*a[22],a[18]*a[23],a[18]*a[24],a[18]*a[25],a[18]*a[26],a[19]*a[19],a[19]*a[20],a[19]*a[21],a[19]*a[22],a[19]*a[23],a[19]*a[24],a[19]*a[25],a[19]*a[26],a[20]*a[20],a[20]*a[21],a[20]*a[22],a[20]*a[23],a[20]*a[24],a[20]*a[25],a[20]*a[26],a[21]*a[21],a[21]*a[22],a[21]*a[23],a[21]*a[24],a[21]*a[25],a[21]*a[26],a[22]*a[22],a[22]*a[23],a[22]*a[24],a[22]*a[25],a[22]*a[26],a[23]*a[23],a[23]*a[24],a[23]*a[25],a[23]*a[26],a[24]*a[24],a[24]*a[25],a[24]*a[26],a[25]*a[25],a[25]*a[26],a[26]*a[26]};

,然后使用此功能对其进行转换:

std::vector<double > ArrayToVector(double* arr,size_t arr_len) {
return std::vector<double>(arr,arr + arr_len);
}

std::vector<double> vec1= ArrayToVector(a,405);
std::vector<double> vec2= ArrayToVector(b,405);

将数组转换为向量会导致内存问题。我正在寻找一种将第一个数组a[405]转换为向量后立即删除的方法,以便为第二个数组转换保留一些内存。我尝试使用new运算符,但这对我不起作用。任何其他减少内存使用的解决方案都值得赞赏。 然后,我使用a []和b []使用此函数来计算其标量积:

double scalar_product(std::vector<double> a,std::vector<double> b)
{
    if( a.size() != b.size() ) // error check
    {
        //puts( "Error a's size not equal to b's size" ) ;
        return -1 ;  // not defined
    }
    // compute
    double product = 0;
    for (unsigned int i = 0; i <= a.size() - 1; i++)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

解决方法

正如一些人已经在注释中建议的那样,您实际上并不需要将数组转换为向量-只需直接使用数组即可。您只需要添加数组的大小作为函数的第三个参数即可。为此,您显然需要知道大小,但是由于它是在内存预算紧张的微控制器上运行的,因此,我相对确定您可以访问大小信息。看起来像这样:

double scalar_product(double a[],double b[],unsigned int size)
{
    // compute
    double product = 0;
    for (unsigned int i = 0; i <= size - 1; i++)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

我假设它们的大小是相同的(它们应该是),但是即使不相同,您也可以通过提供较短的大小,使用它来为两个不同大小的数组计算(部分)标量积。

,

您不是通过double[]动态地分配new[]数组,因此无法动态释放它们。它们在自动内存中声明,因此只有在超出范围时它们才会被释放。

由于您担心内存使用量有限,因此最好的选择是根本不将double[]数组转换为std::vector<double>。改为更改您的scalar_product()函数,使其可以按原样处理原始double[]数组,例如:

double scalar_product(const double *a,size_t a_size,const double *b,size_t b_size)
{
    if( a_size != b_size ) // error check
    {
        //puts( "Error a's size not equal to b's size" ) ;
        return -1 ;  // not defined
    }
    // compute
    double product = 0;
    for (size_t i = 0; i < a_size; ++i)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

double a[405] = ...;
double b[405] = ...;
double product = scalar_product(a,405,b,405);

/*
if,for some reason,you also needed to get the product of vectors,you can do this:

double scalar_product(const std::vector<double> &a,const std::vector<double> &b)
{
    return scalar_product(&a[0],a.size(),&b[0],b.size());
}

vector<double> a = ...;
vector<double> b = ...;
double product = scalar_product(a,b);
*/

或者:

double scalar_product(const double *a,size_t n)
{
    // compute
    double product = 0;
    for (size_t i = 0; i < n; ++i)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

double a[405] = ...;
double b[405] = ...;
double product = scalar_product(a,const std::vector<double> &b)
{
    return (a.size() == b.size())
        ? scalar_product(&a[0],a.size())
        : -1.0;
}

vector<double> a = ...;
vector<double> b = ...;
double product = scalar_product(a,b);
*/

或者,如果直接传递原始数组,而不传递指针指向数组,则可以让编译器为您推断出数组大小:

template<size_t a_size,size_t b_size>
double scalar_product(const double (&a)[a_size],const double (&b)[b_size])
{
    if( a_size != b_size ) // error check
    {
        //puts( "Error a's size not equal to b's size" ) ;
        return -1 ;  // not defined
    }
    // compute
    double product = 0;
    for (size_t i = 0; i < a_size; ++i)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

double a[405] = ...;
double b[405] = ...;
double product;

product = scalar_product(a,b); // OK

double *pa = a;
double *pb = b;
product = scalar_product(pa,pb); // COMPILER ERROR

/*
this approach doesn't work with vectors,so you will need a
separate overload of scalar_product() for that...
*/

或者:

template<size_t N>
double scalar_product(const double (&a)[N],const double (&b)[N])
{
    // compute
    double product = 0;
    for (size_t i = 0; i < N; ++i)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

double a[405] = ...;
double b[405] = ...;
double product;

product = scalar_product(a,b); // OK

double c[404] = ...;
double d[405] = ...;

product = scalar_product(c,d); // COMPILER ERROR

/*
this approach doesn't work with vectors,so you will need a
separate overload of scalar_product() for that...
*/

否则,如果数组大小在编译时是恒定的,则只需对其进行硬编码:

const size_t ArrSize = 405;

double scalar_product(const double (&a)[ArrSize],const double (&b)[ArrSize])
{
    // compute
    double product = 0;
    for (size_t i = 0; i < ArrSize; ++i)
        product += (a[i])*(b[i]); // += means add to product
    return product;
}

double a[ArrSize] = ...;
double b[ArrSize] = ...;
double product = scalar_product(a,b);

/*
this approach doesn't work with vectors,so you will need a
separate overload of scalar_product() for that...
*/
,

必须动态分配数组(使用new[]运算符),以便使用delete[]运算符释放数组。正如评论所提到的,您应该发布如何创建数组,以便我们可以更好地了解它们在内存中的存储方式。

double a* = new double[size];
// do stuff with a
delete[] a;

以上示例是合法的,将按照您的要求进行。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...