![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Hyps |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
Смысл проблемы такой:
есть класс
есть некоторая функция, например:
ну или в программе есть такой момент
вобщем программа постоянно ошибку доступа к памяти если размер массива x достаточно большой а по сути он должен быть большой в той задаче где используется но если убрать delete из деструктора все работает, но возникает маленькая проблема, за один прогон программы засира**ся 20 мб памяти, и её нужно как то очищать, можно написать отдельную фукцию в которой удалять массивы, но в примере №1 такой способ не катит... в общем для меня это единственный камень приткновения в моей работе... P.S. нашел в одной книге алгоритм "сбора мусора", но он замедляет программу раз в десять, а при работе с нейронными сетями и генетическим алгоритмами, которые и так долго работаю, это не приемлимо... из моих попыток как то это исправить стало понятно что деструктор просто срабатывает раньше чем нужно, почему? не понятно |
||||||
|
|||||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Почему бы не использовать приятный во всех отношениях std::vector?
Наводит на мысль - переопределены ли конструктор копирования и оператор присваивания? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
либо используй std::vector либо используй конструктор копий, но если у тебя выделяется большой кусок памяти, то возможно использовать стратегию подсчета ссылок
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Hyps |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
стандартный вектор неподходит просто потому что я математик и мой вектор был написан специально для моих нужд и я не думаю что в стандартном векторе есть эти функции, но это не главное, я не думаю что в стандартных библиотеках есть классы нейронов и нейронных сетей, индивидов и популяций для генетических алгоритмов.... даже если они и есть то я им не доверяю, т.к. я сам занимаюсь разработкой этих алгоритмов и лучше других знаю нюансы... а наши програмисты настолько бестолковые что приходится писать все самому... ладно... конструктор копирования переопределен, а так же переопределены все возможные операторы. Добавлено @ 14:25
я уже говорил что использовал алгоритм "сбора мусора", я его списал из книжки, там как раз используется стратегия подсчета ссылок, но она реально замедляет работу программы... но там алгоритм какой то замутненный... напиши пожалуйста коментарии к твоему коду, а то я не все понимаю, я все-таки математик |
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
надеюсь понятно -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Так и не стоит использовть std::vector вместо своих специфических нужд. Его стоит использовать для хранения данных. То есть заменить на std::vector<int> x; на x.resize(m); delete[] x из деструктора соответственно выкинуть. После замены хуже навряд ли кому станет. Ведь в конце концов int* предназначен для расчетов в гораздо меньшей степени, чем vector, который сам способен позаботится об освобождении памяти.
Конструктор копирования плиз и оператор присваивания плиз в студию. зы. только при использовании std::vector надо помнить, что если у них у каждого свои внутренности. То есть если есть ::vector a,b; , a = b; a[0] = b[0]+1; то в случае использования std::vector'а для хранения данных изменится только a[0]. В коде MAKCim,а изменится еще и b[0]. (подразумеваем, что a[i] суть a.x[i]) -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Hyps |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
Допустим.... Но: 1. что делать с кучай других классов о которых я говорил ранее 2. мне надо редактировать абсолютно все что я сделал за 2 года зы кстати, может и глупый вопрос, но я так и не понял, зачем вообще нужен конструктор копирования и в каких случаях он вызывается? Это сообщение отредактировал(а) Hyps - 19.2.2006, 21:08 |
||||||
|
|||||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Вот оно. Тут просто копируется указатель. Таким образом, если сделать vector a(b) (где a,b - рассматриваемы вектора, а не std::), то при уничтожении a уничтожится и содержимое b (так как delete[] x таки освободит память) а при попытке уничтожить b, если повезёт, программа рухнет сразу. А если нет - то позже. а конструктору копирования вызываются довольно часто: здесь ведь будет вызван именно конструктор копирования. а при выходе из ф-ции он уничтожит не только себя, но и свой "источник". Пусть vector a принимается по ссылке. нейронов и прочего? пускай живут. Зачем их трогать, если они корректны? Незачем. Пусть живут... Пусть даже ::vector живёт. Только вот int *x в нём поменять (ну и аргументы принимать по ссылке, а не по значению). ... x[i] раньше работало, оно и сейчас работать будет. Так что особо глобальных изменений после перехода с массивов на std::vector'а не будет (за одним правда исключением - код отныне не должен полагать что vector a; vector b(a); b[0]=a[0]+1; изменит не только b, но и a.) Это сообщение отредактировал(а) Mayk - 19.2.2006, 20:57 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Hyps |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
зы кстати, может и глупый вопрос, но я так и не понял, зачем вообще нужен конструктор копирования и в каких случаях он вызывается?
Добавлено @ 21:17
но там такая же ситуация с массивами... ты мне лучше из всего выше написанного выдели момент которыйнужно изменить для корректной работы того что есть... |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
конструктор копирования нужен для корректного создания копий экземляров классов, если те содержат "стремные" моменты типа указателей и прочего
пример
при непереопределенном копирующем конструкторе он генерируется компилятором автоматически и производит побитовое копирование полей класса это значит, что указатели в объектах (в моем примере) будут указывать на рдин и тот же участок памяти, и значит будут удаляться дважды исправленный пример
вызывается: 1. инициализация объектом этого же типа 2. передача объекта в ф-ю, если она принимает не указатель и не ссылку 3. возвращение объекта из ф-ии (опять же если не ссылка и не указатель) 4. вызывается для объектов-агрегатов в опр. случаях ... Это сообщение отредактировал(а) MAKCim - 19.2.2006, 21:47 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
что-то около того:
Это сообщение отредактировал(а) Mayk - 19.2.2006, 21:56 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Hyps |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
Mayk спасибо за информацию, а тоя все понять не мог зачем это надо, теперь более менее заработало, но...
при длинне вектора 500000 вылетает, или если длинна меньше а самих векторов больше один хрен вылетает, а их у меня в программе всегда больше з.ы. а почему нельзя вместо std::copy просто загнать все это в обычный цикл... Это сообщение отредактировал(а) Hyps - 19.2.2006, 23:04 |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
можно, но не нужно. Скорость работы std::copy скорее будет выше скорости простого цикла. В конце концов это еще и короче писать - меньше возможности ошибиться.
хмм. В принципе не должно вылетать. Полмиллиона double'ов на винде это 4 метра оперативки. Оно вылетает точно из-за большого числа элемента? Кстати, возможно стоит подумать о кэшировании результатов. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Hyps |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
когда делаешь вектор меньшей длинны оно все работает нормально, а вылетает как раз при выполнении операции присваивания... когда в цикле поэлементное приравнивание идет он в определенный момент вылетает, как правило на последнем шаге цикла... кстати может std::copy лучше сработает, но я еще не попробовал Это сообщение отредактировал(а) Hyps - 20.2.2006, 12:12 |
|||
|
||||
| Hyps |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
блин...
заработало... теперь только разобрать полностью как это все работает и зашибись... надо обратится к первоисточникам, почитать умные книжки... кстати, Mayk, мож посоветуеш какие нибудь с учетом того что я програмист-самоучка и не всегда понимаю че вы мудреные профессионалы пишете... я смотрел у вас раздел книги, там 2 для себя отметил (Bjarne Stroustrup, The C++ Language: Third Edition, Special и Роберт Седжвик "Фундаментальные алгоритмы на C++"), но не знаю насколько они подойдут... хочу приобрести Герберт Шилдт, Полный справочник по С++, твое мнение? зы а sts::copy работает с двойными массивами и собственными типами данных? ззы спасибо за помощь! у меня не у одного подобные проблемы, так что можно сказать от спасибо от некоторой части кафедры системного анализа моего универа, а то наши програмисты такие балбесы, они кроме БД ничего делать не умеют, им когда показываешь свои классы они смотрят на них как некоторые на новые ворота... тыкают пальцем и спрашивают: "а что это такое?", "а это зачем?", "ух ты! а я и не знал что так можно", а ведь их этому учат, а нас нет... зззы ... и я все равно не понимаю зачем делать нужны ссылки и const здесь
ведь без них и так все работает.... да и посмыслу как то не понятно получется Это сообщение отредактировал(а) Hyps - 20.2.2006, 12:55 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |