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

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

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

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

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

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

Спасибо, это я уже понял. Но моя проблема не в этом и она по-прежнему остается.
Rangok вне форума Ответить с цитированием
Старый 01.08.2012, 00:58   #22
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Rangok
я тебя попросил выложить минимальный, самодостаточный код, на котором проявляется проблема. ты же чего то тупишь.

Цитата:
Проблема проявляется при удалении элементов, а код вот:
ну так и приведи кусок рабочего года (чтобы я смог у себя скомпилировать и посмотреть). толку от твоих вырванных кусков нет.
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 вне форума Ответить с цитированием
Старый 01.08.2012, 01:12   #23
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Есть даже такой термин: pure virtual function call

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


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

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

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

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

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

Цитата:
При уничтожении объектов, запускаются диструкторы всех классов
возможно я сейчас потроллю, но такими фразами разбрасываться опасно. я могу привести код, который будет компилироваться без ошибок (но возможно с варнингом), в котором при выполнении "delete obj" деструктор obj вызван не будет (но память, отведенная для объекта очистится). естественно, не прибегая к перегрузке delete.
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 вне форума Ответить с цитированием
Старый 01.08.2012, 01:23   #24
Rangok
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2Rangok
я тебя попросил выложить минимальный, самодостаточный код, на котором проявляется проблема. ты же чего то тупишь.
ну так и приведи кусок рабочего года (чтобы я смог у себя скомпилировать и посмотреть). толку от твоих вырванных кусков нет.
Да я не могу привести "минимальный кусок кода", где проблема проявляется, потому что не знаю где она проявляется (если не считать того, что она проявляется при удалении). А построение этого контейнера, удаление которого происходит так долго является основной задачей программы. Если хотите могу всю программу выложить.

Последний раз редактировалось Rangok; 01.08.2012 в 01:27.
Rangok вне форума Ответить с цитированием
Старый 01.08.2012, 01:28   #25
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Rangok
пройдись отладчиком, посмотри, какие функции вызываются, на каких задерживается
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 вне форума Ответить с цитированием
Старый 01.08.2012, 01:59   #26
Rangok
Пользователь
 
Регистрация: 30.07.2012
Сообщений: 13
По умолчанию

При удалении элемента отладчик постоянно прыгает на каких-то функциях их xutility
в функции operator*() const прыгает на строчке
Код:
	reference operator*() const
		{	// return designated value
		_RanIt _Tmp = current;
		return (*--_Tmp);
и в функции _Adopt(const container base 12*) на строчке
Код:
 #if _ITERATOR_DEBUG_LEVEL == 2
			if (_Myproxy != _Parent_proxy)
				{	// change parentage
				_Lockit _Lock(_LOCK_DEBUG);
				_Orphan_me();
				_Mynextiter = _Parent_proxy->_Myfirstiter;
				_Parent_proxy->_Myfirstiter = this;
				_Myproxy = _Parent_proxy;
				}
		}
Профайлер говорит:
Функции с максимальной индивидуальной работой
Имя Эксклюзивное время %
__RTC_CheckEsp 15,88
std::char_traits<char>::compare(cha r const *,char const *,unsigned int) 8,75

Последний раз редактировалось Rangok; 01.08.2012 в 02:18.
Rangok вне форума Ответить с цитированием
Старый 01.08.2012, 08:45   #27
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

У вас Debug версия, соотвественно лишние проверки. Запустите Release и будет вам счастье. Вам кстати уже об этом говорили выше.
waleri вне форума Ответить с цитированием
Старый 01.08.2012, 19:21   #28
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
ты внимательнее посты автора читай. определил он тело деструктора. в крестах если функция чисто виртуальна - это не значит, что тела у нее нет. и это вполне стандартизировано.
Код:
virtual ~Node()=0; //автор считает, что туловище диструктору не нужно.

Цитата:
Сообщение от pproger Посмотреть сообщение
возможно я сейчас потроллю, но такими фразами разбрасываться опасно. я могу привести код, который будет компилироваться без ошибок (но возможно с варнингом), в котором при выполнении "delete obj" деструктор obj вызван не будет (но память, отведенная для объекта очистится). естественно, не прибегая к перегрузке delete.
Проблема удаления объектов неполных типов ортогональна к отсутствию диструктора у интерфейса.

Даже у абстрактного класса должен быть диструктор.
А ты вот попробуй написать портируемый код: класс без диструктора.

А я посмотрю, как он у тебя будет взлетать.
И как ты заставишь его работать? Каждый раз искусственно создавать ситуацию удаления не полных типов?
_Bers вне форума Ответить с цитированием
Старый 01.08.2012, 19:37   #29
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
ты внимательнее посты автора читай. определил он тело деструктора. в крестах если функция чисто виртуальна - это не значит, что тела у нее нет. и это вполне стандартизировано.
В крестах, у любого класса обязан быть реализованный диструктор. Но не любой диструктор можно реализовать:

http://ideone.com/EOH6I

Не знаю как ты, но я гцц воспринимаю как самый строгий в отношении стандарта компилятор. И его "авторитету" доверяю побольше, чем твоему.

Как видишь, гцц сказал: у чисто виртуальных методов не должно быть реализации.

А вот диструктор должен быть у каждого класса. Канитель получается, ага.

То, что студийные компиляторы позволяют писать реализацию для чисто виртуальных функций - это специфик Корпорации Зла, и не является решением по стандарту. Это нужно понимать.

Мораль: никогда не нужно делать чисто-виртуальных диструкторов, и будет вам счастье.
_Bers вне форума Ответить с цитированием
Старый 01.08.2012, 21:28   #30
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
я тебе еще раз говорю, очки протри! автор ОПРЕДЕЛИЛ ТЕЛО ДЕСТРУКТОРА!
http://programmersforum.ru/showpost....2&postcount=16

Цитата:

В классе Node данных не содержится, поэтому я объявил чистый виртуальный деструктор, чтобы он не вызывался просто так.
Код:


public:
virtual ~Node()=0;


и
Код:

Node::~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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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