|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
Как сделать так, чтобы вернулась часть объекта?18.10.2014, 15:20. Показов 3980. Ответов 69
Метки нет (Все метки)
Поскольку в C++ возможно всё, вот я и решил, может и такое возможно?
Менять можно весь код и реализацию kl, но интерфейс (2 строчки в main) должны остаться неизменными. Спасибо, кто откликнется.
0
|
||||||
| 18.10.2014, 15:20 | |
|
Ответы с готовыми решениями:
69
Как сделать так, чтобы программа копировала часть текста из консоли? Как сделать так, чтобы эта часть кода искала файлы по расширениям?
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 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,705
|
|||||||
| 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,705
|
||
| 18.10.2014, 22:43 [ТС] | ||
|
Я уже склоняюсь к мысли, что эта штука new delete для того и была придумана, чтобы именно выделять и освобождать память в разных местах, если возникает необходимость как сейчас, например. Ибо только собственная невнимательность может воспрепятствовать нормальному написанию и выполнению программы. Ну так не всё ж должно быть гладко, иногда нужно приложить усилия над собой и поднапрячься.
0
|
||
|
|
|
| 18.10.2014, 22:51 | |
|
Представь ты работаешь с чужим кодом (а может быть даже с собранной библиотекой и у тебя только хидеры). Ты видишь ф-цию, которая возвращает указатель на что-то. Ок, используешь ее, все работает. Тебе даже в голову не придет, что ты должен где-то освободить какую-то память, пока не прочитаешь документацию к коду (1. если она есть 2. да кто ж ее читает). Это лишь один из множества примеров почему так делать нельзя. По-моему такие вещи со временем начинают интуитивно пониматься.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 18.10.2014, 22:54 [ТС] | |
|
Тут пожалуйста поподробнее. Если я вижу хидеры, то с меня и взятки гладки, я же не вижу реализацию и не смогу её поправить никоим образом. И тем более память какую-то освободить.
0
|
|
|
|
||
| 18.10.2014, 23:02 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 18.10.2014, 23:05 [ТС] | |
|
Я же сказал- реализации-то у меня нет. как я её смогу поправить? Писать самому? Ну и что остаётся в сухом остатке? То, что я взял у кого-то ОДНИ ЛИШЬ хидеры. Без реализации. Без объектных файлов. Без *.dll-ок. Ситуация смешная какая-то.
0
|
|
|
|
||||
| 18.10.2014, 23:08 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 18.10.2014, 23:12 [ТС] | |
|
Я ничё не понимаю. Во-первых, я не понимаю, что в данном случае собранная библиотека. Это может быть *.dll? Ну, наверное. Итак, у меня меня есть хидер и dll-ка к нему и ещё файл *.a, и где я буду должен освободить память? Править dll-ку в hievе?
0
|
|
| 18.10.2014, 23:15 | |
|
Не по теме: есть ощущение, что мы либо о разных вещах говорим, либо об одной, но каждый на своей волне )
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||
| 18.10.2014, 23:18 | |||
|
Kastaneda, имеет ввиду что кто то написал корявую библиотеку вот у тебя есть описание функции SuperPuperStruct * SuperPuperFunc() которая возвращает какую то структуру, внутри себя выделяет память и как то инициализирует ты смело её используешь раз так 100 или 1000 и получаешь утечку памяти, потому что тот забыл написать что память ты должен сам удалять вот к этому и звучит
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 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,705
|
|
| 19.10.2014, 01:57 [ТС] | |
|
Структуру в потоке создавать нельзя. По синтаксису существует функция потока, принимающая 4 параметра, последний из который указатель void*. И он служит для того, чтобы в него передать указатель на любую структуру, в которую запихать какие-нибудь данные для обработки в функции потока. Следовательно, если в функцию потока передаётся структура, то создана она должна быть где-нибудь в другом месте- в каком нибудь обработчике события. А не в функции потока, куда, повторю, всего-навсего передаётся указатель на неё.
Вообще вы не хуже меня знаете, оконные процедуры- штука хитрая. Это не простое консольное main. Логическое начало в одном обработчике, конец в другом. Ткнул на кнопку- поток создался. Ткнул на другую- завершился. Сработали две разных функции-обработчика события. В одной выделилась память под структуру, в другой освободилась. Такие дела.
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 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,705
|
|||
| 19.10.2014, 02:08 [ТС] | |||
|
0
|
|||
| 19.10.2014, 02:08 | |
|
Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть! Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть Как сделать так чтобы метод объекта возвращал бы объект своего же типа? Как сделать так чтобы картинка в Image не мерцала при увеличении объекта? Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|