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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2012, 16:06   #11
Rangok
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Rangok
Код кривой. 80k элементов - это ни о чём.
http://liveworkspace.org/code/cb2109...27981718ce5f94

Искать кривизну, исправлять её. задействовать отладчик и профайлер.
Я понимаю, что "код кривой", раз такие тормоза при удалении. Только как найти "кривизну" я пока не понял.

В этом ли проблема?
Цитата:
Сообщение от Rangok Посмотреть сообщение
На сколько я понял, проблема состоит в дефрагментации динамической памяти при создании объектов через new.
Может быть лучшим решением будет создать свою кучу для занесения в нее объектов Node1 , Node2 ,Node12 (при завершении работы освободить разом всю память из кучи)?
Rangok вне форума Ответить с цитированием
Старый 31.07.2012, 16:18   #12
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Rangok Посмотреть сообщение
В этом ли проблема?
Разве после освобождения всей кучи разом не будут вызываться деструкторы объектов? По-моему в лучшем случае выигрыша во времени не будет, а в худшем это приведёт к печальным последствиям (но я могу и ошибаться )
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 31.07.2012, 16:25   #13
Rangok
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Last Посмотреть сообщение
Разве после освобождения всей кучи разом не будут вызываться деструкторы объектов?
Но все объекты будут находится в этой куче и если освободить память, занимаемой кучей, то объекты автоматически удаляется, разве нет?
Rangok вне форума Ответить с цитированием
Старый 31.07.2012, 16:26   #14
plgrm44
Пользователь
 
Регистрация: 29.05.2012
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Rangok Посмотреть сообщение
То есть я могу написать в базовом классе ~Node(){}, а в классах потомках вообще не писать деструкторов?


А поподробнее можно? Применительно к Microsoft Visual Studio или QtCreator.
В VS для проекта есть различные конфигурации сборок. Для создаваемого проекта создаются две конфигурации: Debug и Release. Для дебага также переопределяется оператор new для того, чтобы вести учет использования динамической памяти. Для релиза этого всего нет.
plgrm44 вне форума Ответить с цитированием
Старый 31.07.2012, 16:28   #15
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
То есть я могу написать в базовом классе ~Node(){}, а в классах потомках вообще не писать деструкторов?
Да. Но если только не надо в этих классах освобождать ресурсы. Тогда деструктор нужен. Только обязательно virtual ~Node(){}
или
Код:
public:
    virtual ~Node()=0;
и
Код:
Node::~Node()
{}
Если нужен чисто виртуальный деструктор, осталось только придумать - зачем?
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 31.07.2012 в 16:34.
Krok27 вне форума Ответить с цитированием
Старый 31.07.2012, 17:08   #16
Rangok
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Krok27 Посмотреть сообщение
Да. Но если только не надо в этих классах освобождать ресурсы. Тогда деструктор нужен. Только обязательно virtual ~Node(){}
или
Код:
public:
    virtual ~Node()=0;
и
Код:
Node::~Node()
{}
Если нужен чисто виртуальный деструктор, осталось только придумать - зачем?
В классе Node данных не содержится, поэтому я объявил чистый виртуальный деструктор, чтобы он не вызывался просто так.
Код:
public:
    virtual ~Node()=0;
и
Код:
Node::~Node()
{}
Но в классах Node1 Node2 и Node12 содержатся контейнеры
Код:
 typedef set<NodeCont::iterator,CompareObj> LinksCont;
Поэтому я объявил в этих классах деструкторы.
Код:
public:
    ~Node1(){}
public:
    ~Node2(){}
public:
    ~Node12(){}
Rangok вне форума Ответить с цитированием
Старый 31.07.2012, 17:19   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
чтобы он не вызывался просто так.
У абстрактного класа будет просто так вызываться деструктор?..
p51x вне форума Ответить с цитированием
Старый 31.07.2012, 17:22   #18
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Rangok
Цитата:
В классе Node данных не содержится, поэтому я объявил чистый виртуальный деструктор, чтобы он не вызывался просто так.
это не значит, что деструктор вызываться не будет. деструктор делается чисто виртуальным в тех случаях, когда нужен абстрактный класс, но другие функции не подходят на роль чисто виртуальных
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.07.2012, 20:24   #19
Rangok
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 13
По умолчанию

А ну ясно, да значит зря объявлял)
А что по поводу главного вопроса?
Rangok вне форума Ответить с цитированием
Старый 31.07.2012, 20:26   #20
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Rangok Посмотреть сообщение
В классе Node данных не содержится, поэтому я объявил чистый виртуальный деструктор, чтобы он не вызывался просто так.
Есть даже такой термин: pure virtual function call

Твой чисто виртуальный диструктор - это детище корпорации Зла.
Только студийные компиляторы пропускают такое мимо ушей.
Писать чисто виртуальные диструкторы - не по стандарту, и соответственно твой код будет не портируемым.


На языке с++ у каждого класса без исключений существует конструктор, и диструктор.

В случае, если прототип объявлен программистом, компилятор уже не будет создавать дефолтную реализацию диструктора.

При уничтожении объектов, запускаются диструкторы всех классов, входящих в иерархию, вплоть до самого старого предка, у которого ты объявил чисто-виртуальный диструктор.

А поскольку у него нет туловища - ошибка компиляции/компоновки.

Повторюсь - студийные компиляторы пасут такую ситуацию, и позволяют создавать чисто виртуальные диструкторы. Они для них пустую реализацию подпихивают. Другие компиляторы, которые более строгие в отношении стандарта пошлют тебя нахрен.

Последний раз редактировалось _Bers; 31.07.2012 в 20:28.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
освобождение динамически выделенной памяти Einsttein Общие вопросы C/C++ 9 26.05.2010 15:40
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45