![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Bokul |
![]()
Сообщение
#61
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Цитата 1 удалять с кучи прежний объект
![]() Цитата 2 не допускать этого
![]() Цитата 3 самому назначать индексы
![]() PS Только что заметил: по времени вышло почти 10 часов, как и предсказывал, хотя я и не подстраивался ![]() Сообщение отредактировано: Bokul - 1.12.2006 19:48 -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#62
|
Гость ![]() |
|
Bokul |
![]()
Сообщение
#63
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Я не понимаю почему там не возникает ошибки.
Сейчас obj_int и первый элемент массива any_arr.arr указывают на один и тот же объект в кучи.
Теперь я хочу поставить первым элементом указатель на другой объект.
Так как первый элемент не равнялся nil, то выполнение any_arr.set_index приведет к выполнению этого куска кода, в котором мы освобождаем память, выделенную под Tint, но один указатель, связанный с этим участком памяти, у нас остался - obj_int. Почему не возникает ошибки сдесь: dispose(obj_int,done); ? Эта ж память уже не с чем не связанна... -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#64
|
Гость ![]() |
Цитата Я не понимаю почему там не возникает ошибки. Это ты как определил? Я бы выразился по-другому: Turbo Pascal не показывает тебе, что там есть ошибка... Попробуй тот же код (закомментировав MemAvail) прогнать в FPC ![]() |
Bokul |
![]()
Сообщение
#65
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Error 210
Цитата With range-checking on, you made a call to an object's virtual method, before the object had been initialized via a constructor call. Почему Turbo Pascal не видит эту ошибку? Что он делает? Еще раз освобождает эту память? А если она уже была зарезервированна для другого объекта или переменной? А вот в таком случае (см. атач) получаем RunTime Error 204. Какая разница? Почему в данном варианте он видит, а там - нет? Прикрепленные файлы ![]() -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Bokul |
![]()
Сообщение
#66
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Извиняюсь, не увидел вопроса
Цитата Это ты как определил? После столько часов медитации над кодом все видно ![]() -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Bokul |
![]() ![]()
Сообщение
#67
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Надо сделать деструктор объекта T виртуальным, так как для правильной очистки полиморфических объектов с памяти надо знать их размер, а виртуальный деструктор это обеспечит. Естественно у наследников надо тоже сделать деструкторы виртуальными. Правильно?????
-------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Bokul |
![]() ![]()
Сообщение
#68
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Цитата Надо сделать деструктор объекта T виртуальным, так как для правильной очистки полиморфических объектов с памяти надо знать их размер, а виртуальный деструктор это обеспечит. Естественно у наследников надо тоже сделать деструкторы виртуальными. Правильно????? Или уже никто не заглядывает в эту тему? Сообщение отредактировано: Bokul - 3.12.2006 22:14 -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#69
|
Гость ![]() |
Ну, так ты программу-то приаттачь со всеми изменениями, тогда и посмотрим, остаются утечки или нет
![]() |
Bokul |
![]()
Сообщение
#70
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Вот:
Прикрепленные файлы ![]() -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#71
|
Гость ![]() |
В принципе, почти правильно... Но нужно еще кое-что добавить, потому что программа еще пропускает, например... Ну, вот результат:
Эскизы прикрепленных изображений ![]() |
Bokul |
![]() ![]()
Сообщение
#72
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
А утечек нету?
А с 210 я воюю уже давно, даже догадываюсь что ты поменял ![]() any_arr.count_each(new(PTfloat,create)); вместо new(PTfloat,create) поставил что-то наподобие obj_float... Так? Бороться не знаю как... Подскажешь? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Bokul |
![]()
Сообщение
#73
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Продолжаю ставить вопросы на которые никто не отвечает
![]() Можно ли как-то программно отличить any_arr.count_each(new(PTfloat,create) ) от any_arr.count_each(obj_float )? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#74
|
Гость ![]() |
Отвечаю... Естественно, вопросом на вопрос: "А зачем?"
Смысл этого привести сможешь? Что тебе даст, если ты это определишь? Все равно, у тебя (почти всегда) в count_each будет передан указатель на объект. Вот и работай с ним... Какая тебе (а тем более, твоей функции count_each) разница, сконструирована инициализация объекта прямо на месте, или передан указатель, уже использованный в программе? Это что-то меняет? Значит, неправильно спроектирована программа... Исправляй так, чтобы работало независимо от способа передачи параметров... ![]() |
Bokul |
![]()
Сообщение
#75
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Цитата Значит, неправильно спроектирована программа... Полностью согласен. ![]() Цитата Какая тебе (а тем более, твоей функции count_each) разница, сконструирована инициализация объекта прямо на месте, или передан указатель, уже использованный в программе? А как освободить с памяти объект на который нет указателя? Вот тебе и разница... ![]() Вот еще вариант, мне кажется, что тоже не правильно, но идея должна быть такой, т.е. передавать в метод не указатель, а тип. Прикрепленные файлы ![]() -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#76
|
Гость ![]() |
Цитата А как освободить с памяти объект на который нет указателя? А вот с этого места, пожалуйста, поподробнее... То есть, ты считаешь, что вот эта программа:typeне напечатает ничего? Как же она может напечатать, если я передаю (да еще и константно) указатель на объект, который НЕ существует? Вынужден тебя огорчить, она будет работать... Объясни тогда, почему, если НЕТ указателя? Цитата Полностью согласен. Ха... А ты что думал, я дам программку, в которой надо изменить 2 символа и она будет работать, как положено? Нет уж... ![]() |
Bokul |
![]()
Сообщение
#77
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
В общем я имел ввиду объект с потерянным на него указателем, но не страшно, развития вопроса мне нравится...
![]() Цитата Как же она может напечатать, если я передаю (да еще и константно) указатель на объект, который НЕ существует? Что, он действительно не существует? ![]() Цитата Объясни тогда, почему, если НЕТ указателя? Цитата procedure print_me(const p: pT); А что же тогда такое p? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#78
|
Гость ![]() |
Цитата Что, он действительно не существует? А теперь я тебя спрошу:procedure TArr.count_each(const p: PT);Что должно быть на месте вопросов, чтобы внутри count_each произошла Run-Time ошибка 210 ? ![]() |
Bokul |
![]()
Сообщение
#79
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Цитата И где именно она может произойти Так как 210 ошибка возникает при обращению к виртуальному методу не инициализированного объекта, а единственный используемый метод это done, то следовательно такая ошибка может возникнуть только здесь - Цитата dispose(p,done); Цитата Что должно быть на месте вопросов, чтобы внутри count_each произошла Run-Time ошибка 210 ? Указатель на не инициализированный объект, правда в таком случае ошибка произойдет раньше... -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#80
|
Гость ![]() |
Ты сам себе противоречишь, тебе не кажется? Ты покажи такой ответ, которого можно добиться... То есть, чтобы ошибка была предсказуемой... Твой предыдущий пост не отвечает на поставленный вопрос, ты вводишь сам себя в заблуждение (так ошибка произойдет на показанной тобой строке, или раньше?) Вот я сейчас могу показать, что надо сделать, чтобы произошла именно ошибка №210, а не немедленное закрытие программы, "неправильная инструкция" или еще что-то в этом роде... Следовательно, я смогу и избежать этой ошибки... Пока ты не научишься ошибки предсказывать - об их исправлении не может быть и речи
![]() |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 20:51 |