2017-04-02 87 views
-1

我有一個函數,它接收一個數組並定義一個由原始數組的子集組成的新數組。傳遞給函數的數組給出了nan元素(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; 
} 

當運行該代碼的一些子陣列的元件的出來作爲楠。

+8

很多內存泄漏 – P0W

+2

爲什麼不使用'std :: vector'而不是數組?爲什麼手動內存管理('new' /'delete')而不是智能指針?這段代碼看起來好像是1998年的.. –

+0

'''''NaN'的值是否也是? – ForceBru

回答

0

調用子數組正在創建一個新的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個。這不一定是錯誤,但效率不高。

+1

也可以。代碼格式化程序扼流器如果在列表之後使用。 – user4581301

+0

你沒有錯,但使用智能指針而不是手動內存管理會更好。 –

+0

我認爲學習語言的人至少應該知道發生了什麼,然後選擇他們使用的工具。因此,我們可以在那裏拋出一個智能指針,隱藏正在發生的事情......但在這種情況下,我們只是有更多的人不知道內存泄漏如何工作。如果人們接受了關於手動記憶管理的教育,那麼他們可以對例如智能ptr vs共享ptr,因爲他們對構造函數和析構函數的工作方式以及範圍有一定的瞭解。 –