我有一个函数,它接受一个数组并定义一个由原始数组子集组成的新数组。
#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形式出现。
答案 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个。这不一定是错误,但效率不高。