|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
||||||
Как сделать так, чтобы вернулась часть объекта?18.10.2014, 15:20. Показов 3623. Ответов 69
Метки нет (Все метки)
Поскольку в C++ возможно всё, вот я и решил, может и такое возможно?
Менять можно весь код и реализацию kl, но интерфейс (2 строчки в main) должны остаться неизменными. Спасибо, кто откликнется.
0
|
||||||
| 18.10.2014, 15:20 | |
|
Ответы с готовыми решениями:
69
Как сделать так, чтобы программа копировала часть текста из консоли? Как сделать так, чтобы эта часть кода искала файлы по расширениям?
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 18.10.2014, 17:39 [ТС] | |
|
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||||||||||||
| 18.10.2014, 17:46 | ||||||||||||||||||||||||||
|
Здесь:
0
|
||||||||||||||||||||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|||||||
| 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,698
|
||
| 18.10.2014, 22:43 [ТС] | ||
|
Я уже склоняюсь к мысли, что эта штука new delete для того и была придумана, чтобы именно выделять и освобождать память в разных местах, если возникает необходимость как сейчас, например. Ибо только собственная невнимательность может воспрепятствовать нормальному написанию и выполнению программы. Ну так не всё ж должно быть гладко, иногда нужно приложить усилия над собой и поднапрячься.
0
|
||
|
|
|
| 18.10.2014, 22:51 | |
|
Представь ты работаешь с чужим кодом (а может быть даже с собранной библиотекой и у тебя только хидеры). Ты видишь ф-цию, которая возвращает указатель на что-то. Ок, используешь ее, все работает. Тебе даже в голову не придет, что ты должен где-то освободить какую-то память, пока не прочитаешь документацию к коду (1. если она есть 2. да кто ж ее читает). Это лишь один из множества примеров почему так делать нельзя. По-моему такие вещи со временем начинают интуитивно пониматься.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 18.10.2014, 22:54 [ТС] | |
|
Тут пожалуйста поподробнее. Если я вижу хидеры, то с меня и взятки гладки, я же не вижу реализацию и не смогу её поправить никоим образом. И тем более память какую-то освободить.
0
|
|
|
|
||
| 18.10.2014, 23:02 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 18.10.2014, 23:05 [ТС] | |
|
Я же сказал- реализации-то у меня нет. как я её смогу поправить? Писать самому? Ну и что остаётся в сухом остатке? То, что я взял у кого-то ОДНИ ЛИШЬ хидеры. Без реализации. Без объектных файлов. Без *.dll-ок. Ситуация смешная какая-то.
0
|
|
|
|
||||
| 18.10.2014, 23:08 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 18.10.2014, 23:12 [ТС] | |
|
Я ничё не понимаю. Во-первых, я не понимаю, что в данном случае собранная библиотека. Это может быть *.dll? Ну, наверное. Итак, у меня меня есть хидер и dll-ка к нему и ещё файл *.a, и где я буду должен освободить память? Править dll-ку в hievе?
0
|
|
| 18.10.2014, 23:15 | |
|
Не по теме: есть ощущение, что мы либо о разных вещах говорим, либо об одной, но каждый на своей волне )
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|||
| 18.10.2014, 23:18 | |||
|
Kastaneda, имеет ввиду что кто то написал корявую библиотеку вот у тебя есть описание функции SuperPuperStruct * SuperPuperFunc() которая возвращает какую то структуру, внутри себя выделяет память и как то инициализирует ты смело её используешь раз так 100 или 1000 и получаешь утечку памяти, потому что тот забыл написать что память ты должен сам удалять вот к этому и звучит
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 19.10.2014, 01:18 [ТС] | |
|
Тому, кто так работает-
1) не принимает указатель на структуру, 2) возвращает указатель на структуру Тут хотелось бы остановиться. Мне кажется, я со своим ничтожным опытом без труда спалю этот случай по прототипу функции и сам соображу, что надо освобождать память. Но справедливости ради, я ещё с таким не сталкивался. ++++++++++++++++++++++++++++++++++++++++ +++++++ 3) и не пишет надо оборвать руки. Это значит только одно- рано или поздно его код даст прикурить, хоть он сто раз оговорит. И нужно держаться от него подальше и заносить в чёрную книгу разработчиков. Но честно говоря, я бы такой способ просёк потому что он бросился бы мне в глаза потому опять же, что так никто не пишет. Попробую и я обходиться без него. Добавлено через 1 час 44 минуты ++++++++++++++++++++++++++++++++++++++++ ++++ ++++++++++++++++++++++++++++++++++++++++ ++++ ++++++++++++++++++++++++++++++++++++++++ ++++ ++++++++++++++++++++++++++++++++++++++++ ++++ Вот я вам щас теоретический вопрос задам по тому, где выделять и освобождать память. Вот, к примеру я создаю многопоточное оконное приложение. (Понятное дело, главный поток "обслуживает окно", но я щас о других, дочерних ему потоках.) По его запуску начинает работать несколько потоков. Какое именно количество- заранее неизвестно. То есть их количество определяется автоматически, всякий раз оно разное. Для каждого потока существует функция потока, в неё передаётся указатель на структуру. В этой структуре всякие разные данные, с которыми функция потока работает. Память под структуру выделяется динамически (поскольку, мы не знаем, сколько потоков и, следовательно сколько таких элементов нам понадобится.) Вопрос- а где я выделяю память под эту структуру? В самом начале программы. Например, в функции-обработчике события возникновения окна. Надеюсь, это всем понятно? Пошли дальше. В процессе работы приложения пользователь убивает потоки, нажимая на кнопки. Теперь следите за руками. Я нажал на кнопку, в обработчике события click я уничтожил поток. И, коль скоро потока больше нет, необходимо память под структуру, указатель на которую был передан в функцию потока. Освободить. Где это делать? Естессно, тут же, в функции обработчике click. Понятно, к чему я клоню? Память под структуру, нужную для потока, выделяем в самом начале в функции-обработчике события возникновения окна. А освобождаем её в функции-обработчике события click. В разных то есть местах. По-другому никак.
0
|
|
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 19.10.2014, 01:49 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 19.10.2014, 01:57 [ТС] | |
|
Структуру в потоке создавать нельзя. По синтаксису существует функция потока, принимающая 4 параметра, последний из который указатель void*. И он служит для того, чтобы в него передать указатель на любую структуру, в которую запихать какие-нибудь данные для обработки в функции потока. Следовательно, если в функцию потока передаётся структура, то создана она должна быть где-нибудь в другом месте- в каком нибудь обработчике события. А не в функции потока, куда, повторю, всего-навсего передаётся указатель на неё.
Вообще вы не хуже меня знаете, оконные процедуры- штука хитрая. Это не простое консольное main. Логическое начало в одном обработчике, конец в другом. Ткнул на кнопку- поток создался. Ткнул на другую- завершился. Сработали две разных функции-обработчика события. В одной выделилась память под структуру, в другой освободилась. Такие дела.
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||
| 19.10.2014, 02:01 | |||||||
|
Рекомендация "я тебя породил, я тебя и убью", на мой взгляд, относится к контексту выполнения. Т.е. в случае с dll это следует понимать так: Память выделилась (new) внутри dll, через api стала доступной в клиентском приложении (которое эту dll использует). Мы использовали эти данные в приложении и теперь их надо удалить. А как? Внутри dll использовалась new, malloc, tmalloc, my_super_fast_allocator и т.д. Мы точно не знаем что именно, потому что в документации это не указано, а исходников у нас нет. Или даже знаем, но, вот беда, рантайм, с которым линковалась dll статически, вкомпилен в нее и освобождать память, через delete, выделенную с помощью new, но в другом экземпляре рантайма - нельзя (категорически). Вот мы и приплыли. Поэтому рекомендация "в одном и том же месте" на мой взгляд предусматривает под одним и тем же местом тот же самый контекст выполнения, а не тот же самый класс или функцию. Т.е. в вышеприведенном примере правильная dll предоставила бы еще и функцию освобождения данных. Вот пример:
Если же мы оставим в API только первую функцию, то вышеописанные проблемы тут же всплывают. Если вернуться к твоему с примеру с потоками, то, имхо, там все правильно, основной поток создал данные и основной поток же потом их освободил. Принцип не нарушен. А вот если бы он их создал в одном потоке, а освобождать принялся из другого, то вот тут уже нужно насторожиться. Но, я скажу так: как нет серебряной пули, так и нет решения, которые было бы правильно или неправильно во всех случаях. Поэтому без детального рассмотрения задачи нельзя утверждать, что это некорректно. Но насторожиться можно.
0
|
|||||||
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 19.10.2014, 02:05 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|||
| 19.10.2014, 02:08 [ТС] | |||
|
0
|
|||
| 19.10.2014, 02:08 | |
|
Помогаю со студенческими работами здесь
60
Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть! Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть Как сделать так чтобы метод объекта возвращал бы объект своего же типа? Как сделать так чтобы картинка в Image не мерцала при увеличении объекта? Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|