Форум программистов, компьютерный форум CyberForum.ru

Течёт память рекой - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Системы счисления http://www.cyberforum.ru/cpp-beginners/thread552125.html
Задано положительное действительное число up в системе счисления с основанием p с фиксированной точкой, и основание q (p, q ≠ 2, 8, 10, 16). Требуется: 1. Перевести число up в систему счисления с основанием q (при проверке работы программы числа up и q задаются преподавателем). 2. Перевести число up в 32-разрядный двоичный код, после чего это число с по-мощью разбиения на тетрады (т.е. на...
C++ Списки: функции для работы со списками Помогите пожааааааалуйста с задачками!!!! ;) ОПИШИТЕ ФУНКЦИИ ТИПОВЫХ ОПЕРАЦИЙ С СПИСКАМИ: 1. Функция AddHead (int d) добавление узла в голову списка; 2. Функция AddEnd (int d) добавление узла в конец списка; 3. Функция ShowList() вывод списка на экран; 4. Функция Search (int d) поиск узла с заданным значением в некотором поле данных; 5. Функция FindNode (int n) поиск узла с заданным... http://www.cyberforum.ru/cpp-beginners/thread552121.html
C++ Итерационные циклы
Написать программу вычисления значения функции, заданной в виде ряда, с погрешностью епсилон> 0,0001 п(пи)=3+4*(1/2*3*4 - 1/4*5*6 + 1/6*7*8 -....) Напишите пожалуйста, нужно для будущего авиации)))
Найти корень уравнения методом простой итерации C++
Дано уравнение acos(x)-x2, корень нужно найти на интервале . Я уже пробовал много разных вариантов, но остановился на таком(он хоть что-то выдает). Правда результат не очень утешительный: Enter the beginning of segment -> -1 Enter the ending of segment -> 1 2.14159 -1.#INF -1.#IND -1.#IND Result = -1.#IND
C++ Вычислить определённый интеграл методом тропеций http://www.cyberforum.ru/cpp-beginners/thread552101.html
помогите пожалуйста ни как не пойму как реализовать вычисление интеграла
C++ Матрицы: процедура случайной перестановки строк в матрице Уважаемые, помогите пожалуйста написать процедуру случайной перестановки строк в матрице. Работа с битовой последовательностью подробнее

Показать сообщение отдельно
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517

Течёт память рекой - C++

18.04.2012, 21:00. Просмотров 352. Ответов 5
Метки (Все метки)

Не могу понять в чём проблема. Есть класс CControl, от него есть наследники CInput и CButton. Просто создание объектов типа CButton и CInput не возникает утечек памяти, использование функции Clone для получения копии объекта (и последующее освобождение памяти через delete) тоже проблем не возникает, а вот когда возникает необходимость хранить объекты наследники CControl в классе CWindow в списке то тут же начинает течь память.

Класс CControl и его наследник. Класс CControl виртуальный, а CButton вполне реальный. У обоих классов есть только статические элементы( за исключением результата работы функции Clone). Виртуальный деструктор я и там и там указал что он есть и он необходим.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class CControl
{
public:
    CControl(int _ID, double xPos1, double yPos1, double xPos2, double yPos2,  const string& _type, const string& _title="")
    :ID(_ID), type(_type), title(_title), x1(xPos1), y1(yPos1), x2(xPos2),y2(yPos2),printFromWindow(false),specialCBprint(false){}
 
    virtual void Print(ostream& os) const
    {
        if(printFromWindow==true)
         os<<"+- ";
 
        os<<"["<<ID<<"]"<<" "<<type<<" "
        <<"\""<<title<<"\" "
        <<"("<<x_1<<","<<y_1<<","
        <<x_2<<","<<y_2<<")"<<endl;
    }
 
    friend ostream& operator<<(ostream& os, const CControl& right)
    {
        right.Print(os);
        return os;
    }
 
    virtual CControl* clone() const =0; //функция, которую должны переопределять наследники
 
    int ID;// our ID
    string type;// Button/Label
    string title;//"Ok" /"Cancel"
 
    //coordinats
    double x1;
    double y1;
    double x2;
    double y2;
 
    //real coordinats to print
    //setted by CWindow
    int x_1;
    int y_1;
    int x_2;
    int y_2;
 
    //+-
    bool printFromWindow;
 
    //|  +-
    bool specialCBprint;
 
    virtual ~CControl()
    {
 
    }
 
};
 
 
 
[CPP]class CButton: public CControl
{
public:
    CButton(int ID, double xPos1, double yPos1, double xPos2, double yPos2, const string& title)
    :CControl(ID, xPos1, yPos1, xPos2, yPos2, "Button", title) {}
 
    virtual CControl* clone() const
    {
        return new CButton(*this);
    }
 
    virtual ~CButton()
    {
 
    }
};
[/CPP]


Класс окно, который держит список контролов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class CWindow
{
private:
    //coordinats
    int fx1;
    int fy1;
    int fx2;
    int fy2;
 
    string title;
 
    int countCB;//how many CCombobox we have
 
    //структура чтобы список контролов держать
    struct ListControl
    {
        ListControl()
        :control(NULL), next(NULL){}
 
        ListControl(const CControl& cont)
        :control(cont.clone()), next(NULL) {}
 
        CControl* control;
        ListControl* next;
    } * head, *tail;
 
 
 
public:
    CWindow(const string& _title, int xPos1, int yPos1, int xPos2, int yPos2)
    :fx1(xPos1), fy1(yPos1), fx2(xPos2), fy2(yPos2), title(_title), countCB(0), head(NULL), tail(NULL) {}
 
 
    ~CWindow()
    {
        ListControl* temp= head;
        ListControl* del;
        while(temp)
        {
            del= temp;
            temp= temp->next;
            delete del;
        }
        head=tail=0;
    }
 
 
    //метод добавления контрола в список
    CWindow& Add(const CControl& obj)
    {
        if(! head)
        {
            head= tail= new ListControl;
            head->control= obj.clone();
            Recalculate(head->control);//масштабирование и прочая ерунда, меняет значения в control, ничего не создаёт и не удаляет
            head->next= NULL;
 
            ///if(dynamic_cast<CComboBox*> (head->control))
            /// countCB++;
        }
 
        else
        {
            ListControl* toAdd= new ListControl;
            toAdd->control= obj.clone();
            toAdd->next= NULL;
            Recalculate(toAdd->control);
            tail->next= toAdd;
            tail= toAdd;
        }
        return *this;
    }

Укажите на ошибку, ато я её в упор не вижу и не могу понять что не так. В мейне если просто создаю объект окно - всё ок, если только добавляю кнопку в окно через Add то получаю в итоге утечки памяти.
В мейн делаю вот так:
C++
1
2
3
4
5
int main()
{
    CWindow a( "Test X", 751, 245, 400, 700 );
    a.Add( CButton ( 1, 0.1, 0.8, 0.3, 0.1, "Ok" ));
}
Тоесть идёт вызов конструктора по умолчанию -> метода Add где всё идёт по первой ветке if (там же вызывается метод Clone от CButton) ну и вызов деструктора. Куда же уходит память ?
Тестирую валгриндом (+ сервер выдаёт мне пенальти за память так что валгринд видать не обманывает).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru