传递给函数的数组给出了纳米元素(C ++)

时间:2017-04-02 18:29:01

标签: c++ arrays

我有一个函数,它接受一个数组并定义一个由原始数组子集组成的新数组。

#include<iostream>
#include<cmath>
using namespace std;
double * subarray(double *array){
       double *sub= new double[100]; 
       for (int i=0; i<10; i++){
         sub[i]=array[i];
       }
    return sub;
}
int main(){
  double *x=new double[100];
  double *y=new double[10];

  for(int j=0; j<100; j++){
     x[j]=sin(j*3.14/2.0);
  }
  y=subarray(x);
  for(int k=0; k<10; k++){
     cout<<y[k]<<endl;
  }
return 0;
} 

当我运行此代码时,子数组的一些元素以nan形式出现。

1 个答案:

答案 0 :(得分:0)

调用subarray正在创建一个新的double [100],然后将其传回去。但它是一个完全独立的数组y = new double [10]。每当你打电话给“新”时,它就会创造一个新东西,与所有其他“新”东西分开。 y获取“new double [100]”的地址,但是它会丢失你在main中创建的“new double [10]”的地址,这是一个内存泄漏。如果您要返回指向新分配项的指针,请启动将其存储为nullptr的指针,并在完成后调用“delete”或“delete []”,具体取决于是否是一个“新[]”或“新”。

#include<iostream>
#include<cmath>
using namespace std;
double * subarray(double *array) {
    double *sub = new double[10]; // don't allocated more than you want to use
    for (int i = 0; i < 10; i++) {
        sub[i] = array[i];
    }
    return sub;
}
int main() {
    double *x = new double[100];
    double *y = nullptr; // don't set this if you're going to overwrite it

    for (int j = 0; j < 100; j++) {
        x[j] = sin(j*3.14 / 2.0);
    }
    y = subarray(x);
    for (int k = 0; k < 10; k++) {
        cout << y[k] << endl;
    }

    delete [] x; // if you make new things, delete them afterwards
    delete [] y;

    std::cin.get();
    return 0;
}

当我运行它时,我没有得到任何NaN,但是你在函数内部分配了大量永远不会被设置的内存。你分配了100个空格,但只写了10个。这不一定是错误,但效率不高。