0 / 0 / 0
Регистрация: 29.07.2017
Сообщений: 1
|
||||||
1 | ||||||
Очистка памяти в процедуре29.07.2017, 16:19. Показов 5762. Ответов 15
Метки нет (Все метки)
Всем привет!
Скажите, надо ли очищать память в данном примере?
0
|
29.07.2017, 16:19 | |
Ответы с готовыми решениями:
15
Очистка памяти MSXML и очистка памяти Очистка памяти в программе Очистка памяти от AnsiString |
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
29.07.2017, 16:50 | 2 |
Если в этой процедуре завершается работа с tss, то надо.
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
|
29.07.2017, 17:53 | 4 |
Обьекты в Delphi передаются только по указателю (мурзилка, последний абзац). Даже если описать их как const их по прежнему можно редактировать (странно конечно, но факт - компялятор даже предупреждение не выдаст).
А значит и уничтожить обьект вы можете в любом месте программы. Но как уже заметил D1973, - где создали, там и удаляем. Потому как
0
|
Житель Земли
|
||||||
29.07.2017, 20:28 | 5 | |||||
а у меня похожий вопрос. давно хотел узнать, но лень было проверить кодом
итак, в функции
0
|
Айлурофил
|
||||||
29.07.2017, 22:29 | 6 | |||||
Из реальной процедуры:
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
||||||||||||||||
29.07.2017, 23:30 | 7 | |||||||||||||||
Для Delphi IMHO не лучшая практика. Хотя возможно все, особенно когда надо создать 100500 почти одинаковых обьектов.
Зовется это фабрикой (по крайней мере в книжках). За создание отвечает сама функция, за уничтожение - как правило тот, кто вызвал эту функцию, при этом вызывающий должен убедиться что обьект действительно создан.
Со TStrings почти все - потому как
Не по теме: Книга с паттернами (в том числе и фабриками) ISBN 0-201-63361-2 в библиотеке какого-то университета, жаль только что примеры кода на C.
1
|
30.07.2017, 01:33 | 8 | ||||||||||
естественно надо и создавать и удалять
функция вернет результат нового указателя, ни к чему не присвоенного, т.е. память то будет выделена где-то там, но с ней не будет проработано. из релаьного проекта могу сказать, что это так ) примерно использовалась конструкция создания нового экземпляра класса так
и чисто из Си, стал часто пользоваться конструкциями типа "Call By Reference", когда функция ворачивает параметром некий результат имеющий что-то с указателем, тогда меньше недоглядок к утечке памяти, в свое время занялся исследованием "потеков", тут тему создавал даже, но она не приобрела смысла, но для себя же, установил некие правила, как можно или нужно, а как лучше не использовать))
0
|
пофигист широкого профиля
4754 / 3189 / 861
Регистрация: 15.07.2013
Сообщений: 18,458
|
|
30.07.2017, 02:17 | 9 |
Ничего странного. В параметрах функции/процедуры всегда передается число. Либо целое, либо вещественное. Объект не передаётся никогда (если это особо не оговорено).
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
|
30.07.2017, 08:47 | 10 |
С этим никто и не спорит, но вот передаем мы строку, массив или запись (словом нечто что по размеру больше пары регистров) - передается указатель. Но если обьявлено, что это константа - изменить мы эту переменную не сможем. И даже если вызов был stdcall или safecall и по факту мы работаем с дупликатом в стеке - изменить не сможем - компилятор будет выдавать ошибку.
С обьектами такое не пройдет, чтоб создать обьект нужно вызывать конструктор - это я понимаю, тут вопросов нет - проще передать указатель. Но вот то что мы можем изменять обьект переданый как константу, и это не то что запрещено, а вообще не контролируется - это на мой взгляд финиш. Хотя бы warning выдавался чтоли? Хотя... как от дурака не защищайся, он всегда найдет способ выстрелить себе в ногу.
0
|
30.07.2017, 13:44 | 11 |
не объект передается как константа, а указатель на него
так указатель вы и не трогаете обычно просто делфи для удобства "разыменовывает" указатели помните recordPtr^.field ? это то же самое так вот ^ не нужна recordPtr.field вполне то же и у объектов и ни с каким "дупликатом в стеке" вы не работаете адрес дома сколько не передавай и не копируй, это будет адрес одного и того же дома, пока не построите новый
2
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
||||||
30.07.2017, 22:41 | 12 | |||||
Я говорю не про сам указатель, а про то на что он указывает. Вот смотрите:
Передаем запись и обьект как константу - они оба передаются через указатель.
Хотя по идее изменить поле записи = изменить данные в некой области памяти. А изменить свойство обьекта - это вызвать обработчик изменения этого свойства. Тоесть на "мелочь" в виде изменения памяти мы реагируем, а на "непонятные телодвижения" - нет. Черт, да мы можем просто взять и уничтожить обьект, обьект который из серии "смотреть можно, руками не трогать". Как по мне, так крайне не логично. Мурзилка думает иначе Кликните здесь для просмотра всего текста
Sets, records, and static arrays of 1, 2, or 4 bytes are passed as 8-bit, 16-bit, and 32bit values. Larger sets, records, and static arrays are passed as 32-bit pointers to the value. An exception to this rule is that records are always passed directly on the stack under the cdecl, stdcall, and safecall conventions; the size of a record passed this way is rounded upward to the nearest double-word boundary.
Google translate Наборы, записи и статические массивы из 1, 2 или 4 байта передаются как 8-битные, 16-битные и 32-битные значения. Большие наборы, записи и статические массивы передаются в виде 32-разрядных указателей на значение. Исключение из этого правила заключается в том, что записи всегда передаются непосредственно в стек под соглашениями cdecl, stdcall и safecall; Размер пройденной таким образом записи округляется вверх до ближайшей границы двойного слова. Хотя если честно - сам не проверял. Это из серии "заметки на полях".
0
|
30.07.2017, 23:05 | 13 | ||||||||||
именно, что и нет
Ну так то 2 разные вещи! С TForm - тут константный указатель, мы не можем изменить внутри процедуры адрес самой передаваемой формы, а все свойства, они имеют неконстантный характер в таком случае. Контантой там является именно адрес на TForm. во втором же случае, у вас там, я предполагаю, запись, запись - не указатель, запись вообще это расширение массива(из глубокого курса по Си) и оно лежит где-то в памяти как "простая", но тут составная переменная, обращаемся не по адресу, обращаемся по значению, потому и нельзя его менять, так как он обозначен константой. точно так же, нельзя и для первого случая делать
krapotkin как раз это, я так полагаю, и хотел сказать, сообщением выше вот еще примерчик
1
|
Animalia
|
31.07.2017, 00:06
#14
|
Не по теме: Вон оно как устроено...
0
|
northener
|
31.07.2017, 01:14
#15
|
0
|
31.07.2017, 08:30 | 16 | |||||||||||||||
const используется еще и для вырезания из кода подсчета ссылок на объект. в старых делфи это только строки, а вот в новых компиляторах для мобил это все объекты
возвращаясь к теме, Arcor все написал правильно, а получение копии объекта это вообще говоря, вещь автоматически не реализуемая в общем виде вот у вас
а если так
уфф. не слишком сложно для простой операции? Поэтому в C++ есть даже отдельный класс конструкторов для копирования.
0
|
31.07.2017, 08:30 | |
31.07.2017, 08:30 | |
Помогаю со студенческими работами здесь
16
Очистка области памяти Создание, уничтожение и очистка памяти от динамического массива Очистка памяти от форм очистка памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |