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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

С++ течет при наследовании - C++

25.01.2013, 18:27. Просмотров 1872. Ответов 46
Метки нет (Все метки)

Если был создан класс где его поля размещались в стеке (Foo)
и унаследован классом (Foo1) который создается динамически.

Как управиться с памятью? Поможет ли вызов деструктора в деструкторе решить эту проблемму или как делаете вы?
C++
1
2
3
4
~Foo1()
{
~Foo();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2013, 18:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ течет при наследовании (C++):

Использование шаблонов при наследовании, ошибка при компиляции - C++
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

Ошибка при наследовании - C++
Здраствуйте,не могу понять где именно оштбся,возможно кто-то поможет,код прилагаю //#include "stdafx.h" #include <iostream> ...

Ошибка при наследовании - C++
Привет! Ни как не могу разобраться, в чём дело. Создал 2 класса: Base и Derived, где Derived наследует Base. Но при компиляции возникает...

Ошибка при наследовании - C++
Имеется архитектура вида: класс "человек", от него производные "препод" и "член приемной комиссии". От их двоих производный класс "Препод и...

Конструкторы при наследовании - C++
Добрый вечер. Пишу программу с наследованием классов. Класс-родитель - nasled, производный от него - steck. Когда пытаюсь вызвать...

Ошибка при наследовании - C++
Вот такой код: class Figure2 { protected: int Color; int CenterX; int CenterY; public:

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
25.01.2013, 23:30 #16
vbloodv, просто ты применяешь delete[] непонятно к чему (в cups должен быть мусор), и вообще не понятно, зачем это там. Предлагаю в первую очередь убрать это недоразумение из тела конструктора.
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.01.2013, 23:33  [ТС] #17
gray_fox, А что делать с ним затем? Пожалуйста более развернутый ответ !
Цитата Сообщение от gray_fox Посмотреть сообщение
непонятно к чему (в cups должен мусор)
- не совсем понимаю в cups после такого удаления остается мусор. Но если я удалю это недоразумение из тела конструктора, то как же мне его создать?
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.01.2013, 23:44 #18
Цитата Сообщение от vbloodv Посмотреть сообщение
Как всегда точно в цель. Спасибо !!!
Это замечательно, но вы не сделали самого главного вывода:
Поэтому ресурсы, которые требуют ручного очищения, надо заворачивать в классы, деструкторы которых выполняют это ручное освобождение ресурсов. А затем использовать именно эти классы как поля, чтобы освобождение выполнялось автоматически.
1
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
25.01.2013, 23:45 #19
vbloodv, ты меня не понял. Map::Map - это конструктор класса Map, он вызывается при создании объекта (без аргументов) и должен его инициализировать, зачем там освобождение памяти - непонятно. Про мусор - cups - обычный указатель, если его не инициализировать самому там может быть любое значение (что лежало на стеке).

Добавлено через 39 секунд
И потом ты применяешь оператор delete[] к "непонятно чему".
1
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.01.2013, 23:53 #20
У стандартных контейнеров вообще не надо вызывать деструкторы. Т.е. так писать: vector_name.~vector() не надо. (отступление - явный вызов деструкторов вообще считается не очень хорошим тоном. именно деструкторов, а не delete). Стандартный контейнер все сам прекрасно удалит. Единственная ситуация, когда ему надо помочь, это если он хранит в себе обычные указатели.
C++
1
2
3
4
5
6
7
8
9
class A
{
some_my_type m_some; // это объект некоторого типа. не надо явно вызывать его деструктор. объект удалится сам
some_my_type* m_some_ptr; // а это уже надо будет явно удалить с помощью delete
shared_ptr<some_my_type> m_some_sptr; // это умный указатель на объект. удалится сам
std::vector<some_my_type> m_vector; // стандартный контейнер. удалится сам. без дополнительных телодвижений в деструкторе
std::vector<some_my_type*> m_ptr_vector; // стандартный контейнер с голыми указателями. чтобы его почистить, надо будет циклом по нему пройтись и удалить каждый элемент через delete
std::vector<shared_ptr<some_my_type>> m_sptr_vector; //стандартный контейнер с умными указателями. удалится сам
};
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.01.2013, 23:55  [ТС] #21
gray_fox, Понял, запихнул по ошибке в конструктор, то что должно быть в деструкторе.
Но инициализация есть
Цитата Сообщение от vbloodv Посмотреть сообщение
C++
1
2
3
4
void Map::Create(HGE ** _hge)
{
* * hge = *_hge;
* * Cup * cups = new Cup[COUNT_N];
вот в этой функции. Меня больше волнуют мой список(std::list<point2d> Way и вектор(Border pointBorder ?

~OhMyGodSoLong~, Есть какие нибудь ошибки которые можно на лету увидеть?
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Поэтому ресурсы, которые требуют ручного очищения,
Возможно мои к таким ресурсам и относятся, правильно удалять list через ~list() и вектор через ~vector();?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
26.01.2013, 00:06 #22
Цитата Сообщение от vbloodv Посмотреть сообщение
правильно удалять list через ~list() и вектор через ~vector();
Неправильно, деструкторы на то и придуманы, чтобы вызываться автоматически. Если вызвать деструктор самостоятельно - то по сути он будет вызван дважды. Пожалуй единственный случай, когда явный вызов деструктора имеет смысл - использование placement new.
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:32  [ТС] #23
gray_fox, представление поменялось. Я сильно усложнил многое. подскажи ещё почему при попадании на
C++
1
 delete[] cups;
программа вылетает ?


Уже не вылетает ! Но показывает утечки

Добавлено через 13 минут
Зановес ! :
const int COUNT_N = 9; // размер
Cup * cups[COUNT_N]; // объявление, член класса C_map.h
Cup * cups = new Cup[COUNT_N]; // инициализация в констукторе C_map.h [УТЕЧКА !]
delete[] cups; // удаление в деструкторе C_map.h

[УТЕЧКА] Visual Leak Detector detected 12 memory leaks (2768 bytes).

если заменяю
C++ (Qt)
1
Cup * cups = new Cup;
, то утечка:
Visual Leak Detector detected 4 memory leaks (460 bytes).

Нашел ещё утечку в удалении текстур и спрайта. Есть ли ошибка в cups ?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
26.01.2013, 00:33 #24
Цитата Сообщение от vbloodv Посмотреть сообщение
показывает утечки
В последнем коде вроде больше нет выделения памяти.

Добавлено через 20 секунд
Если cups удаляешь.
1
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 00:38 #25
Цитата Сообщение от vbloodv Посмотреть сообщение
const int COUNT_N = 9; // размер
Cup * cups[COUNT_N]; // объявление, член класса C_map.h
Cup * cups = new Cup[COUNT_N]; // инициализация в констукторе C_map.h [УТЕЧКА !]
delete[] cups; // удаление в деструкторе C_map.h
Если действительно всё так, то массив указателей cups, объявленный членом класса и указатель cups на массив элементов Cup, объявленный в конструкторе - разные сущности
1
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
26.01.2013, 00:40 #26
Цитата Сообщение от vbloodv Посмотреть сообщение
если заменяю
Программирование подбором? Правила то простые - если сделал new - сделай delete, аналогично с new[]/delete[]. А лучше, как уже не раз здесь писали, пользоваться умными указателями и вообще не иметь головной боли с управлением ресурсами. Возможно HGE требует деинициализации.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Если действительно всё так, то массив указателей cups, объявленный членом класса и указатель cups на массив элементов Cup, объявленный в конструкторе - разные вещи и разные сущности
а слона то я и не заметил...)

1
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 00:43 #27
C++
1
2
3
4
void Map::Create(HGE ** _hge)
{
    hge = *_hge;
    Cup * cups = new Cup[COUNT_N];
Это объявление нового указателя с именем cups, локального для данной функции

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
а слона то я и не заметил...)
ну что ж поделаешь то...бывает

1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:52  [ТС] #28
Croessmah, gray_fox, Я могу инициализацию член именно поле класса?
Вроде бы поля только статические можно инициализировать, а в конструкторе если только через this...
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 00:53 #29
Цитата Сообщение от vbloodv Посмотреть сообщение
а в конструкторе если только через this...
C++
1
2
const int COUNT_N = 9; // размер
Cup * cups; // объявление, член класса C_map.h
а в констукторе тогда(ну или в функции create):
C++
1
cups = new Cup[COUNT_N]; // инициализация в констукторе C_map.h
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:58  [ТС] #30
Croessmah, Мне стыдно только что new[] в msdn прочитал. Напутал в синтаксисе и думал высокие материи...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2013, 00:58
Привет! Вот еще темы с ответами:

Деструктор при наследовании - C++
Имеется 3 класса (базовый -&gt; производный -&gt; производный2) в классе базовый имеется переменная char* var; в производном тоже есть 1...

Конструкторы при наследовании - C++
Описал большую иерархию классов. Надо написать конструкторы, правда уже не очень понимаю как в Си писать конструкторы, к тому же при...

Неоднозначность при наследовании - C++
Привет народ, думаю мой вопрос покажется вам чем-то из разряда &quot;лучше бы делом занялся&quot;, но тех у кого останется терпение, прошу помочь мне...

Сравнение при наследовании - C++
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.01.2013, 00:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru