2015-05-26 2 views
2

Я начинаю программист, и у меня есть вопрос о функции, которая возвращает указатель на массив двойников в C++. Функция принимает два массива и объединяет каждый элемент, например, в сумму векторов.Возвращает указатель на массив из функции в C++?

Я думаю, что правильный способ сделать это ....

double *myfunction(double *x, double *y, int n){ 
    double *r = new double[n]; 
    for(int i=0;i<n;i++){ 
    r[i] = x[i]+y[i]; 
    } 
    return r; 
} 

Проблема заключается в том, что я использую эту функцию в то время как петли в основной функции как этот

int main(){ 
    double *x, *y, *s; 
    x = new double[2]; 
    y = new double[2]; 
    x = {1,1}; 
    y = {2,2}; 

    while(/*some condition */){ 
    /*some process...*/ 

    s = myfunction(x,y, 2); 

    /*some process...*/ 
    } 

    delete[] x; 
    delete[] y; 
    delete[] s; 
} 

Мои Вопрос в том, что происходит с утечкой памяти? Каждый раз, когда я использую «myfunction» (внутри цикла while), я резервирую память для переменной «s», это означает, что если цикл while выполняется 5 раз, то программа резервирует 5 раз память для переменной «?

Существует ли способ сделать это (вернуть указатель на массивы из функции и использовать эту функцию внутри цикла)?

Благодарим вас за продвижение.

+0

'std :: unique_ptr s (myfunction (x, y, 2)) ;, но, честно говоря, я бы использовал' std :: vector' из get-go for * all * динамические распределения в этом коде. – WhozCraig

+0

Является ли 'x = {1, 1}' действительным синтаксисом? – immibis

+0

@WhozCraig Должен быть 'std :: unique_ptr '? – songyuanyao

ответ

3

Я бы сказал, что более правильный способ записи myfunction является:

std::vector<double> myfunction(double *x, double *y, int n){ 
    std::vector<double> r; 
    r.reserve(n); 
    for(int i=0;i<n;i++){ 
    r.push_back(x[i]+y[i]); 
    } 
    return r; 
} 

Таким образом, вам не придется беспокоиться об утечках памяти, и ваш цикл, а может быть просто:

while (/* some condition*/) { 
    std::vector<double> s = myfunction(x, y, 2); 
    // whatever 
} 
4

Чтобы избежать утечки памяти, вам необходимо использовать s, как только вы его получите, и удалите его, как только вы закончите.

int main(){ 
     double *x, *y, *s; 
     x = new double[2]; 
     y = new double[2]; 
     x = {1,1}; 
     y = {2,2}; 

     while(//some condition){ 
     s = myfunction(x,y, 2); 
     //do some process here 
     delete[] s; 
     } 
     delete[] x; 
     delete[] y; 

    } 
2

Вы спросили:

Каждый раз нас e «myfunction» (внутри цикла while) Я резервирую память для переменной «s», это означает, что если цикл while выполняется 5 раз, то программа резервирует 5 раз память для переменной «s»?

Ответ Да.

Вы также спросили:

ли существует способ сделать это (возвращает указатель на массивы из функции и использовать эту функцию внутри цикла) ??

Ответ Да. Вам нужно добавить код для удаления возвращаемых памятей,

while(/*some condition */){ 
    s = myfunction(x,y, 2); 

    // Use s 

    // Now delete s. 
    delete[] s; 
    } 

лучшим решением, чем иметь дело с new и delete будет возвращать std::vector из myfunction. Тогда вам не нужно беспокоиться об управлении памятью. То есть the answer by Barray

Смежные вопросы