![]() |
|
Модераторы: 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 |
|||
|
||||
| Mayk |
|
||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
не читал, не знаю. но не думаю, чтобы их прочтение повредило. Советую поискать хорошую (толстую) книжку по STL. С ним разрабатывать классы подобные ::vector'у из первых сообщений значительно проще. Если ты здесь не сделаешь ссылку/указатель, то сюда передастся копия объекта. А если она не будет изменяться, то передавать копию - расточительная операция (представь, придется скопировать 500.000 double'ов только для того, чтобы их просто считать). Ссылка передается константной потому что передаваемый вектор не должен быть изменён. возвращается ссылка, чтобы можно было делать что-то типа a=b=c. Иногда полезно. Иногда необходимо. с двойными - нет. В том смысле, что
вызовет ошибку компиляции. Хотя если представить их как одинарные, то работает.
кстати, с двойными векторами работает лучше.
ага, если они поддерживает у них есть подходящий operator= (либо определенный самостоятельно, либо созданный компилятором). В этом кстати его прелесть. Как и других ф-ций из STL - они способны работать с абсолютно любыми типами, если те удовлетворяют необходимыми условиями.
ну некоторые из нас(я например) тут не меньшие самоучки Это сообщение отредактировал(а) Mayk - 20.2.2006, 13:41 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||
|
|||||||||
| Hyps |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
а если я сделаю так:
это нормально? |
|||
|
||||
| Hyps |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.2.2006 Где: г. Красноярск Репутация: нет Всего: нет |
ладно, я все проверил, всем спасибо за помощь
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |