244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
|
|
1 | |
Узнать указывает ли указатель13.04.2013, 22:35. Показов 6188. Ответов 16
Метки нет (Все метки)
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться?
Спасибо!
0
|
13.04.2013, 22:35 | |
Ответы с готовыми решениями:
16
Узнать номер элемента массива на который указывает указатель Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе Указатель куда указывает? Указатель не указывает на CHAR |
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
|
||||||||||||||||||||||||||
13.04.2013, 22:44 | 2 | |||||||||||||||||||||||||
в хорошем стиле если он не куда не указывает, там должено быть особое значение NULL
при инициализации указывайте
и всегда после
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
14.04.2013, 03:35 | 3 |
Алсо, можно юзать бустовские умные указатели. Их суть заключается, что вы удаляете не объект, а указатель на объект. Когда никто не указывает на объект - объект сам удаляется.
А вообще, это почти вечная проблема таких компилируемых в машинный код языков программирования. И не совсем понятно, почему. Факт остаётся фактом - программист сам работает с памятью. Более того, когда вы сделали delete, из RAM ничего не исчезнет, система лишь пометит этот кусок, как кусок пригодный для аллокатинга.
1
|
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
|
|
14.04.2013, 04:41 | 4 |
за окном на минутку уже 2013, а вы всё о указателях, allacator-ах, счётчиках ссылок, как в 70-х... пора уже доверить это аппаратуре, и boost'овские умные указатели, согласен хороший способ, но не идиальный
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
14.04.2013, 04:44 | 5 |
Ну да, добро пожаловать в мир современного прогинга. Java, C#, Erlang - я всех уважаю, но когда надо написать быстро и быстрое серверное приложение с сильно ограниченными ресурсами Си++ один из лучших вариантов.
0
|
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
|
|
14.04.2013, 04:50 | 6 |
всё что вы перечислили - выдаёт код для виртуальной машины, в которой существует сборщик мусора (насчёт Erlang правда не уверен полностью), которая согласен, жрёт ресурсы... haskell позволяет создать нативный код
быстрые серверные приложения - их нужны единицы... а дальше всё это оборачивается... хм... я в недавнем прошлом копался с системой openstack... там ну может 5-10% встретил Си-шного кода, который завёрнут в 90% питоновких скриптов и это как раз целая серверная система, ведущая в мире в области Cloud-технологий
0
|
Higher
|
||||||
14.04.2013, 10:32 | 7 | |||||
В общем случае - никак.
Не по теме: Вы ничего серьезнее хелловорлда не писали, видимо. Я вот сейчас пишу курсач на шарпе и просто задолбался уже с GC. Теоретически, программист на с++ должен постоянно думать о работе с памятью, а GC его от этого полностью избавляет. На практике, из-за GC приходится постоянно думать о памяти. Например, есть у меня класс длинных чисел(обертка над гмп, стандартный BigInteger из фреймворка тормозит безумно). в плюсокоде я могу спокойно написать
Если же такое написать в шарпе, то приходится думать, а не создается ли при a * b временный объект, и если создается, то не слишком ли часто... Так как если он создается часто, то GC попросту не успевает проснуться и убрать память, и программа вылетает с OutOfMemoryException. Я так раз пять уже вляпался, каждый раз приходилось менять архитектуру и переписывать на быдлокод, не создающих временных объектов. Еще я пытаюсь все вычисления проводить в кеше, но на практике особой пользы это не приносит, так как в программу постоянно врывается GC, который портит весь кеш. И в итоге все тормозит :( В общем, для нетривиальных вычислений GC не подходит абсолютно. P.S. Для меланхоличного энтерпрайза GC приемлем, тут не спорю. Простите, накипело >_<
0
|
AnyOne697
|
14.04.2013, 19:19
#8
|
Не по теме: Насколько я помню, в шарпах есть конструкция using ( ... ) {}, после которой точно вызывается Dispose(), а GC получает приказ удалить всё using ( здесь ) {}. Алсо, нередко можно использовать ленивые вычисления.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.04.2013, 19:24 | 9 |
Что не ясного? Если ты удалил массив, то уже не указывает.
Добавлено через 2 минуты Разве? Вот же: , что исключает проблему.
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
14.04.2013, 19:28 | 10 |
Вот оно то что! Спасибо! Вы открыли мне глаза! А я думал, где там грёбнная утечка... Теперь-то я знаю, что я должен всё делать сам. Придётся переделывать архитектуру, переписывать over 9k строк кода, переосмысливать поведение тредов. Ещё раз спасибо!
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.04.2013, 19:37 | 11 |
Какая аппаратура? Давно уже не 60-й год, чтоб мечтать о сверхразумной аппаратуре, которая не зная ни замысла, ни текста реализации разберёт представление данных, чтоб понять, где валяются указатели и какие из них уже не нужны, пора уже взять ответственность за память на себя.
Добавлено через 1 минуту То есть слово "элементарно" теперь так изменилось? Добавлено через 1 минуту Покажи, как ты её вообще получишь. Конечно, когда ТС берётся писать, то его и ссылки не спасут, потому что он даже себя не понимает. Ну так эта проблема лечится включением головы.
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
14.04.2013, 19:42 | 12 |
Не всегда и не совсем. Принцип работы умных указателей очень и очень прост: есть объект, у него есть поле, считающее количество ссылок на него. Если поле внезапно равно нулю - удаляем объект как недоступный.
В Си++ доступна адресная арифметика, поэтому так просто сделать не получиться. Но если использовать только векторы и их интерфейсы (и итераторы для обхода), то можно использовать (осторожно) и умные указатели. Впрочем, я сейчас цитирую гения, наверное. Он ведь ни разу не ошибается и очень легко локализует в проекте из 20-30 модулей утечку.
0
|
diagon
|
14.04.2013, 19:47
#13
|
Не по теме: Ээ, она не связана с освобождением памяти. Хотя, в случае с моим MPZInteger можно перенести освобождение памяти из деструктора в Dispose, но тогда появится множество утечек, потому что писать using/dispose для каждого экземпляра немного муторно. А связка using + GC.SuppressFinalize() довольно сильно бьет по перформансу. Вы уверены? В шарпе таки немногое другое понятие скоупа, чем в плюсах. Вроде как там ссылки отвязываются от объекта только в конце метода(даже если имя объекта, к которому они привязаны, видно только в начале метода).
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
14.04.2013, 19:51 | 14 |
и как же оно станет равно нулю?
Добавлено через 2 минуты Оставляя мусор в указателях. Спасибо, а я то думал: как сделать максимально глупый указатель? Так вот же оно! Объект должен просто исчезнуть по собственной инициативе. Добавлено через 59 секунд Объясни, как её вообще получить, а то я ни разу не видел такого чуда.
0
|
AnyOne697
|
14.04.2013, 20:54
#15
|
Не по теме: Нет, не уверен. Но если почитать то, что по ссылке, то именно для этого и был придуман этот механизм - дабы получить некоторый контроль надо памятью. Производительность да, будет ниже, так как потребуется каждый раз чистить мусор. Но ничего не поделаешь. taras atavin, вы либо тролль, либо не понимаете принципы работы GC. Когда удаляется указатель, тогда и декрементируется счётчик. Указателя нет, соответственно не к чему и обратиться.
0
|
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
|
|
14.04.2013, 21:00 | 16 |
полистайте это - http://eax.me/why-haskell/ в языке не надо указателей, в языке не надо реализации алгоритмов (там даже циклов то нет), в языке не надо думать про память и помнить где и что валяется в памяти всё есть и всё работает... фантастика тут не причём
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
14.04.2013, 22:11 | 17 |
Haskell хорошая вещь, но 1) очень и очень требовательная к ресурсам; конечно, если есть овер дофига рам и сотня другая процессоров, то хэскелл вне конкуренции, но обычно это не так; к тому же, можно написать куда оптимально использующее ресурсы приложение на Си++/Java/C#, 2) да и проще это, надо сказать .
Стоит учитывать особенности Haskell, да, некоторые задачи с учётом его особенностей решаются на раз-два, да и эффективность в этих случаях колосальная и не сильно отличается от, с куда сложной архитектурой, уже целого программного комплекса написанного на Си. Но, таких задач мало и они нередко носят чисто научный характер с минимальной практической пользой. К превеликому сожалению.
0
|
14.04.2013, 22:11 | |
14.04.2013, 22:11 | |
Помогаю со студенческими работами здесь
17
Копия того на что указывает указатель Указатель указывает на несуществующую переменную, но выводит значение В нескольких потоках указатель указывает на одну и ту же область памяти Как создать копию объекта на который указывает указатель Как изменить тип объекта, на который указывает указатель? Как вывести адресс на который указывает указатель типа char*. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |