|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||||||
Как сделать так, чтобы вернулась часть объекта?18.10.2014, 15:20. Показов 4250. Ответов 69
Метки нет (Все метки)
Поскольку в C++ возможно всё, вот я и решил, может и такое возможно?
Менять можно весь код и реализацию kl, но интерфейс (2 строчки в main) должны остаться неизменными. Спасибо, кто откликнется.
0
|
||||||
| 18.10.2014, 15:20 | |
|
Ответы с готовыми решениями:
69
Как сделать так, чтобы программа копировала часть текста из консоли? Как сделать так, чтобы эта часть кода искала файлы по расширениям?
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 18.10.2014, 17:39 [ТС] | |
|
0
|
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||||||||||||
| 18.10.2014, 17:46 | ||||||||||||||||||||||||||
|
Здесь:
0
|
||||||||||||||||||||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|||||||
| 18.10.2014, 21:15 [ТС] | |||||||
|
Не просто ли открывался ларчик?
Можно ведь возвращать не объект а указатель на объект. И тогда смело можно возвращать NULL, если что-то не заладится. А если всё заладится- указатель на объект.
Недостатки: необходимо потом применять оператор delete. Но можно и ещё дальше пойти. К примеру, зачем вообще использовать авторский класс? Можно напрямую работать с вектором строк! То есть в случае удачи возвращать vector<string>*. И тогда не понадобится ничего удалять с помощью delete. Не это ли имел ввиду 0X10, говоря
0
|
|||||||
|
|
||
| 18.10.2014, 22:37 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||
| 18.10.2014, 22:43 [ТС] | ||
|
Я уже склоняюсь к мысли, что эта штука new delete для того и была придумана, чтобы именно выделять и освобождать память в разных местах, если возникает необходимость как сейчас, например. Ибо только собственная невнимательность может воспрепятствовать нормальному написанию и выполнению программы. Ну так не всё ж должно быть гладко, иногда нужно приложить усилия над собой и поднапрячься.
0
|
||
|
|
|
| 18.10.2014, 22:51 | |
|
Представь ты работаешь с чужим кодом (а может быть даже с собранной библиотекой и у тебя только хидеры). Ты видишь ф-цию, которая возвращает указатель на что-то. Ок, используешь ее, все работает. Тебе даже в голову не придет, что ты должен где-то освободить какую-то память, пока не прочитаешь документацию к коду (1. если она есть 2. да кто ж ее читает). Это лишь один из множества примеров почему так делать нельзя. По-моему такие вещи со временем начинают интуитивно пониматься.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 18.10.2014, 22:54 [ТС] | |
|
Тут пожалуйста поподробнее. Если я вижу хидеры, то с меня и взятки гладки, я же не вижу реализацию и не смогу её поправить никоим образом. И тем более память какую-то освободить.
0
|
|
|
|
||
| 18.10.2014, 23:02 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 18.10.2014, 23:05 [ТС] | |
|
Я же сказал- реализации-то у меня нет. как я её смогу поправить? Писать самому? Ну и что остаётся в сухом остатке? То, что я взял у кого-то ОДНИ ЛИШЬ хидеры. Без реализации. Без объектных файлов. Без *.dll-ок. Ситуация смешная какая-то.
0
|
|
|
|
||||
| 18.10.2014, 23:08 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 18.10.2014, 23:12 [ТС] | |
|
Я ничё не понимаю. Во-первых, я не понимаю, что в данном случае собранная библиотека. Это может быть *.dll? Ну, наверное. Итак, у меня меня есть хидер и dll-ка к нему и ещё файл *.a, и где я буду должен освободить память? Править dll-ку в hievе?
0
|
|
| 18.10.2014, 23:15 | |
|
Не по теме: есть ощущение, что мы либо о разных вещах говорим, либо об одной, но каждый на своей волне )
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
|||
| 18.10.2014, 23:18 | |||
|
Kastaneda, имеет ввиду что кто то написал корявую библиотеку вот у тебя есть описание функции SuperPuperStruct * SuperPuperFunc() которая возвращает какую то структуру, внутри себя выделяет память и как то инициализирует ты смело её используешь раз так 100 или 1000 и получаешь утечку памяти, потому что тот забыл написать что память ты должен сам удалять вот к этому и звучит
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 19.10.2014, 01:18 [ТС] | |
|
Тому, кто так работает-
1) не принимает указатель на структуру, 2) возвращает указатель на структуру Тут хотелось бы остановиться. Мне кажется, я со своим ничтожным опытом без труда спалю этот случай по прототипу функции и сам соображу, что надо освобождать память. Но справедливости ради, я ещё с таким не сталкивался. ++++++++++++++++++++++++++++++++++++++++ +++++++ 3) и не пишет надо оборвать руки. Это значит только одно- рано или поздно его код даст прикурить, хоть он сто раз оговорит. И нужно держаться от него подальше и заносить в чёрную книгу разработчиков. Но честно говоря, я бы такой способ просёк потому что он бросился бы мне в глаза потому опять же, что так никто не пишет. Попробую и я обходиться без него. Добавлено через 1 час 44 минуты ++++++++++++++++++++++++++++++++++++++++ ++++ ++++++++++++++++++++++++++++++++++++++++ ++++ ++++++++++++++++++++++++++++++++++++++++ ++++ ++++++++++++++++++++++++++++++++++++++++ ++++ Вот я вам щас теоретический вопрос задам по тому, где выделять и освобождать память. Вот, к примеру я создаю многопоточное оконное приложение. (Понятное дело, главный поток "обслуживает окно", но я щас о других, дочерних ему потоках.) По его запуску начинает работать несколько потоков. Какое именно количество- заранее неизвестно. То есть их количество определяется автоматически, всякий раз оно разное. Для каждого потока существует функция потока, в неё передаётся указатель на структуру. В этой структуре всякие разные данные, с которыми функция потока работает. Память под структуру выделяется динамически (поскольку, мы не знаем, сколько потоков и, следовательно сколько таких элементов нам понадобится.) Вопрос- а где я выделяю память под эту структуру? В самом начале программы. Например, в функции-обработчике события возникновения окна. Надеюсь, это всем понятно? Пошли дальше. В процессе работы приложения пользователь убивает потоки, нажимая на кнопки. Теперь следите за руками. Я нажал на кнопку, в обработчике события click я уничтожил поток. И, коль скоро потока больше нет, необходимо память под структуру, указатель на которую был передан в функцию потока. Освободить. Где это делать? Естессно, тут же, в функции обработчике click. Понятно, к чему я клоню? Память под структуру, нужную для потока, выделяем в самом начале в функции-обработчике события возникновения окна. А освобождаем её в функции-обработчике события click. В разных то есть местах. По-другому никак.
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 19.10.2014, 01:49 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 19.10.2014, 01:57 [ТС] | |
|
Структуру в потоке создавать нельзя. По синтаксису существует функция потока, принимающая 4 параметра, последний из который указатель void*. И он служит для того, чтобы в него передать указатель на любую структуру, в которую запихать какие-нибудь данные для обработки в функции потока. Следовательно, если в функцию потока передаётся структура, то создана она должна быть где-нибудь в другом месте- в каком нибудь обработчике события. А не в функции потока, куда, повторю, всего-навсего передаётся указатель на неё.
Вообще вы не хуже меня знаете, оконные процедуры- штука хитрая. Это не простое консольное main. Логическое начало в одном обработчике, конец в другом. Ткнул на кнопку- поток создался. Ткнул на другую- завершился. Сработали две разных функции-обработчика события. В одной выделилась память под структуру, в другой освободилась. Такие дела.
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 19.10.2014, 02:01 | |||||||
|
Рекомендация "я тебя породил, я тебя и убью", на мой взгляд, относится к контексту выполнения. Т.е. в случае с dll это следует понимать так: Память выделилась (new) внутри dll, через api стала доступной в клиентском приложении (которое эту dll использует). Мы использовали эти данные в приложении и теперь их надо удалить. А как? Внутри dll использовалась new, malloc, tmalloc, my_super_fast_allocator и т.д. Мы точно не знаем что именно, потому что в документации это не указано, а исходников у нас нет. Или даже знаем, но, вот беда, рантайм, с которым линковалась dll статически, вкомпилен в нее и освобождать память, через delete, выделенную с помощью new, но в другом экземпляре рантайма - нельзя (категорически). Вот мы и приплыли. Поэтому рекомендация "в одном и том же месте" на мой взгляд предусматривает под одним и тем же местом тот же самый контекст выполнения, а не тот же самый класс или функцию. Т.е. в вышеприведенном примере правильная dll предоставила бы еще и функцию освобождения данных. Вот пример:
Если же мы оставим в API только первую функцию, то вышеописанные проблемы тут же всплывают. Если вернуться к твоему с примеру с потоками, то, имхо, там все правильно, основной поток создал данные и основной поток же потом их освободил. Принцип не нарушен. А вот если бы он их создал в одном потоке, а освобождать принялся из другого, то вот тут уже нужно насторожиться. Но, я скажу так: как нет серебряной пули, так и нет решения, которые было бы правильно или неправильно во всех случаях. Поэтому без детального рассмотрения задачи нельзя утверждать, что это некорректно. Но насторожиться можно.
0
|
|||||||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 19.10.2014, 02:05 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|||
| 19.10.2014, 02:08 [ТС] | |||
|
0
|
|||
| 19.10.2014, 02:08 | |
|
Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть! Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть Как сделать так чтобы метод объекта возвращал бы объект своего же типа? Как сделать так чтобы картинка в Image не мерцала при увеличении объекта? Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|