Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Удаление динамически выделенной памяти


Автор: maxi91m 27.10.2010, 01:22
Что я делаю не так, почему не удаляется память выделенная в другой функции?
Если делать глобальными    double *fact; и double *deg; то так же не могу удалить выделенную память.
Можно не удалять но тогда я думаю в памяти копится мусор, а так не правильно.
 smile 

Код

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <clocale>


double* degris(double x, int p)
{
    double *deg = new double[p];
    deg[0] = 1;
    deg[1] = x;
    int i;
    for(i=2; i<p; i++)
        deg[i] = deg[i-1]*x;
    return deg;
}
double* fact_l(int n)
{
    double *fact = new double[n];
    fact[0] = 1;
    int i;
    for(i=1;i<n; i++)
        fact[i] = fact[i-1] * (double)i;
    return fact;
}
int main()
{
    setlocale(LC_CTYPE,"Russian");

    double *fact;
    double *deg;

    double delta = 1, m_exp, sum_exp=0, x;
    int n = 0;
    printf("Введите число от которого будите вычислять exp(x)\n");
    printf("x = ");
    scanf("%Lf",&x);
    m_exp = exp(x);
    n=1;
    while(delta != 0){
        sum_exp = 0;
        printf("Точтность  1.e-%d \n",n);
         /*Посчитаем все степени до заданного порядка*/
        deg = degris(x,n);
        /*Факториалы*/
        fact = fact_l(n);

        printf("%.*Lf \n",n,m_exp);

        for(int i = n-1; i >= 0; i--)
            sum_exp += deg[i]/fact[i];

        printf("%.*Lf \n",n,sum_exp);
        delta = fabs(m_exp-sum_exp);
        printf("Погрешность = %.*Lf \n",n,delta);
        n++;
        //delete[] deg; ошибка!!!!
        //delete[] fact; ошибка!!!!
    }
    system("pause");
}

вот и ошибка
Код

Windows has triggered a breakpoint in Exp.exe.

This may be due to a corruption of the heap, which indicates a bug in Exp.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Exp.exe has focus.

The output window may have more diagnostic information.

Автор: Dov 27.10.2010, 01:46
вынеси delete за пределы цыкла. 

Автор: maxi91m 27.10.2010, 08:04
Но у меня в цикле вызываются функции где выделяется память, и я хочу после каждого прохода удалять, а так я уже не буду знать что удалять

Автор: azesmcar 27.10.2010, 08:28
maxi91m

Ты выходишь за пределы массива
Код

double *deg = new double[p];
deg[0] = 1;
deg[1] = x;
...

в случае, когда p == 1 (а это первый же шаг цикла) тут у тебя будет undefined behavior, отсюда и ошибка при удалении.

Автор: EgorTheBlade 27.10.2010, 08:34
 delete [n] fact; поставте где вы пишите ошибка.
     delete [n]deg;  Вынесите за цикл

Автор: maxi91m 27.10.2010, 08:41
Цитата(azesmcar @ 27.10.2010,  09:28)
maxi91m

Ты выходишь за пределы массива
Код

double *deg = new double[p];
deg[0] = 1;
deg[1] = x;
...

в случае, когда p == 1 (а это первый же шаг цикла) тут у тебя будет undefined behavior, отсюда и ошибка при удалении.

Спасибо, подправил, теперь работает.
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)