Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2015, 18:10   #1
Smolya
Новичок
Джуниор
 
Регистрация: 23.02.2015
Сообщений: 3
По умолчанию Освобождение памяти

Код:
#include <stdio.h>
#include <math.h>
using namespace std;
// класс точки плоскости  
class Point2 {
    private:
        int x;
        int y;
    public:
        Point2(int _x, int _y) : x(_x), y(_y) { };  // конструктор точки
        int getx() { return x; }; // доступ к x
        int gety() { return y; }; // доступ к y
    friend double distance(Point2*, Point2*); // расстояние между 2-мя точками
    };//Point2 
// дружественная функция вычисления расстояния между двумя точками 
double distance(Point2* r, Point2* q) {
    double d2=(r->x-q->x)*(r->x-q->x)+(r->y-q->y)*(r->y-q->y); 
    return (sqrt(d2));
    }  // distance 
//Основная функция
int main(int argc, char* argv[ ]) { 
    double dist;
    double max; // максимальное расстояние от первой до остальных точек
    Point2** gener; // адрес массива адресов точек набора
    Point2** p;
    Point2** z;
    Point2* t;   // адрес текущей точки
    int x,y;         //    координаты точки
    int k=0;
    int m=0;
    int i=0;
    int j=0; // номера точек набора 
        if(argc < 4) //анализ числа аргументов командной строки
            return(-1); 
    gener = new Point2*[argc]; // распределить память под массив адресов точек
        while(++k < argc) { //цикл ввода точек из командной строки 
            sscanf(argv[k], "(%d%*c%d)", &x, &y); // получение координат точки
        gener[m]=new Point2(x,y);
            if (y>0)j++;
            else
            if (y<0)i++;
        m++;                                                                                                      
        } // while
    gener[m]=NULL;
    p = new Point2*[j];
    z = new Point2*[i];
    for (i=0, j=0, m=0; gener[m]!=NULL; m++){
        if (gener[m]->gety()>0){
            p[j]=gener[m];
            j++;
        }
        else {
            z[i]=gener[m];
            i++;
        }   
     }
    p[j]=NULL;
    z[i]=NULL; // маркировка конца массива адресов точек набора
    max=0.0;
        
        for (j=0; p[j]!= NULL;  j++)  { // цикл вычисления средних расстояний
            t = p[j];     // фиксировать адрес текущей точки
                for (i=0; z[i] != NULL;  i++){  // цикл суммирования расстояний от текущей точки до остальных
                        dist=distance(t, z[i]);
                        if (dist>max) max=dist; //вычисление  расстояния до текущей точки 
                }
        } // for-i
        printf("MAX=%f\n", max); // ->
        //  освобождить дин. память точек набора  по их адресам
        for(m=0; gener[m] != NULL; m++)
            delete gener[m];    
    delete [  ]gener;   
      //  освобождить дин. память массива адресов точек 
    return 0; //корректное завершение программы
    }// main
ребят, удаляя память gener, я удалю память в z и p?
просто, когда я все удаляю, то терминал выдает ошибку: double free or corruption (faststop)
Smolya вне форума Ответить с цитированием
Старый 23.02.2015, 18:37   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

На каждый new должен быть delete.
z[i] и p[i] удалять не нужно, а вот сами массивы неплохо было бы и очистить
delete[] z; delete[] p;
pu4koff вне форума Ответить с цитированием
Старый 23.02.2015, 18:39   #3
Smolya
Новичок
Джуниор
 
Регистрация: 23.02.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
На каждый new должен быть delete.
z[i] и p[i] удалять не нужно, а вот сами массивы неплохо было бы и очистить
delete[] z; delete[] p;
Спасибо
А почему элементы z и p не удаляем, а gener[i] нужно удалять?
Smolya вне форума Ответить с цитированием
Старый 23.02.2015, 18:43   #4
Smolya
Новичок
Джуниор
 
Регистрация: 23.02.2015
Сообщений: 3
По умолчанию

И все же, ошибка double free or corruption осталась.
Smolya вне форума Ответить с цитированием
Старый 23.02.2015, 19:38   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Перепроверяйте в отладчике что у вас с индексами происходит.
Особенно обратите внимание на:
Код:
p = new Point2*[j];
z = new Point2*[i];
Что там с i и j происходит? Не нолик ли там?
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти SAMOUCHKA Общие вопросы по Java, Java SE, Kotlin 7 26.01.2014 21:24
освобождение памяти Homa_1983 Общие вопросы C/C++ 7 31.08.2013 14:36
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36