2017-04-02 3 views
-1

私は配列を取り、元の配列のサブセットからなる新しい配列を定義する関数を持っています。関数に渡された配列は、ナノ要素を与える(C++)

#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として出力されます。

+8

メモリリークが多い – P0W

+2

配列ではなく 'std :: vector'を使用してみませんか?なぜスマートポインタではなく手動メモリ管理( 'new' /' delete')ですか?このコードはsooo 1998'ishと思われます。 –

+0

'x'の値はNaNですか? – ForceBru

答えて

0

呼び出し側のサブアレイが新しいdouble [100]を作成し、それを戻しています。しかし、それはy = new double [10]とは全く別の配列です。あなたが「新」と呼ぶときはいつでも、それは新しいものを作り、他のすべての「新しい」ものに分かれています。 yは "new double [100]"のアドレスを取得しますが、メインで作成した "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に書き込むだけです。これは必ずしもエラーではありませんが、効率的ではありません。

+1

これも機能します。リストの後に使用される場合、コードフォーマッターのチョーク。 – user4581301

+0

あなたは間違っているわけではありませんが、手動メモリ管理ではなくスマートポインタを使用するほうがはるかに良いでしょう。 –

+0

私は、言語を学ぶ人々は、少なくともフードの中で何が起こっているのかを知っていなければならず、次に彼らが使うツールを選ぶべきだと思います。だからこそ、何が起こっているのかを隠すスマートなポインタを投げることができます。しかしその場合、メモリリークの仕組みがわからない人が増えてしまいます。人々が手作業によるメモリ管理について教育されている場合、彼らは情報の選択を行うことができます。スマートptrと共有ptrは、コンストラクターとデストラクタがどのように動作するか、スコープについての知識があるためです。 –

関連する問題