Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление динамически выделенной памяти 
V
    Опции темы
maxi91m
  Дата 27.10.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Что я делаю не так, почему не удаляется память выделенная в другой функции?
Если делать глобальными    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.

--------------------
PM MAIL ICQ   Вверх
Dov
Дата 27.10.2010, 01:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



вынеси delete за пределы цыкла. 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
maxi91m
Дата 27.10.2010, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Но у меня в цикле вызываются функции где выделяется память, и я хочу после каждого прохода удалять, а так я уже не буду знать что удалять
--------------------
PM MAIL ICQ   Вверх
azesmcar
Дата 27.10.2010, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



maxi91m

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

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

в случае, когда p == 1 (а это первый же шаг цикла) тут у тебя будет undefined behavior, отсюда и ошибка при удалении.
PM   Вверх
EgorTheBlade
Дата 27.10.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 5.12.2009

Репутация: нет
Всего: -1



 delete [n] fact; поставте где вы пишите ошибка.
     delete [n]deg;  Вынесите за цикл
PM MAIL Skype   Вверх
maxi91m
Дата 27.10.2010, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Цитата(azesmcar @ 27.10.2010,  09:28)
maxi91m

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

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

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

Спасибо, подправил, теперь работает.
 smile 
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.