Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
1

Узнать указывает ли указатель

13.04.2013, 22:35. Показов 6188. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться?
Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2013, 22:35
Ответы с готовыми решениями:

Узнать номер элемента массива на который указывает указатель
Может вопрос глупый но тока что об этом задумался! Можно ли узнать номер элемента массива на...

Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе
Здравствуйте. Имеется базовый класс MainWindow: #ifndef MAINWINDOW_H #define MAINWINDOW_H...

Указатель куда указывает?
Вопрос в комментарии к программе int main() { int count = 0; char str = "atutau"; char...

Указатель не указывает на CHAR
Доброго всем здравия, совсем запутался, написал примитивный код, а он гад не работает. Как такое...

16
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
13.04.2013, 22:44 2
в хорошем стиле если он не куда не указывает, там должено быть особое значение NULL

при инициализации указывайте
C++
1
char * p = NULL;
после того как выделили память например
C++
1
p = new char [10];
он уже не будет указывать в NULL автоматически

и всегда после
C++
1
delete p;
вставляйте
C++
1
p=NULL;
тогда в любой момент проверка
C++
1
 if (p==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
А вообще, это почти вечная проблема таких компилируемых в машинный код языков программирования.
каких таких компилируемых? ) не слышал чтобы подобные проблемы были скажем в haskell

за окном на минутку уже 2013, а вы всё о указателях, allacator-ах, счётчиках ссылок, как в 70-х... пора уже доверить это аппаратуре, и boost'овские умные указатели, согласен хороший способ, но не идиальный
0
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
14.04.2013, 04:44 5
Цитата Сообщение от abit Посмотреть сообщение
каких таких компилируемых? ) не слышал чтобы подобные проблемы были скажем в haskell
за окном на минутку уже 2013, а вы всё о указателях, allacator-ах, счётчиках ссылок, как в 70-х... пора уже доверить это аппаратуре, и boost'овские умные указатели, согласен хороший способ, но не идиальный
Ну да, добро пожаловать в мир современного прогинга. Java, C#, Erlang - я всех уважаю, но когда надо написать быстро и быстрое серверное приложение с сильно ограниченными ресурсами Си++ один из лучших вариантов.
0
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
14.04.2013, 04:50 6
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Ну да, добро пожаловать в мир современного прогинга. Java, C#, Erlang - я всех уважаю, но когда надо написать быстро и быстрое серверное приложение с сильно ограниченными ресурсами Си++ один из лучших вариантов.
всё что вы перечислили - выдаёт код для виртуальной машины, в которой существует сборщик мусора (насчёт Erlang правда не уверен полностью), которая согласен, жрёт ресурсы... haskell позволяет создать нативный код

быстрые серверные приложения - их нужны единицы... а дальше всё это оборачивается... хм...
я в недавнем прошлом копался с системой openstack... там ну может 5-10% встретил Си-шного кода, который завёрнут в 90% питоновких скриптов

и это как раз целая серверная система, ведущая в мире в области Cloud-технологий
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.04.2013, 10:32 7
Цитата Сообщение от metaluga145 Посмотреть сообщение
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться?
Спасибо!
В общем случае - никак.

Не по теме:

Цитата Сообщение от abit Посмотреть сообщение
каких таких компилируемых? ) не слышал чтобы подобные проблемы были скажем в haskell
за окном на минутку уже 2013, а вы всё о указателях, allacator-ах, счётчиках ссылок, как в 70-х... пора уже доверить это аппаратуре, и boost'овские умные указатели, согласен хороший способ, но не идиальный
Вы ничего серьезнее хелловорлда не писали, видимо. Я вот сейчас пишу курсач на шарпе и просто задолбался уже с GC.
Теоретически, программист на с++ должен постоянно думать о работе с памятью, а GC его от этого полностью избавляет. На практике, из-за GC приходится постоянно думать о памяти.
Например, есть у меня класс длинных чисел(обертка над гмп, стандартный BigInteger из фреймворка тормозит безумно).
в плюсокоде я могу спокойно написать
C++
1
2
3
MPZInteger a, b;
...
auto c = a * b;
Я буду уверен, что при c = a * b сработает move конструктор, ну или в с++03 просто сразу же вызовется деструктор для временного объекта.
Если же такое написать в шарпе, то приходится думать, а не создается ли при a * b временный объект, и если создается, то не слишком ли часто... Так как если он создается часто, то GC попросту не успевает проснуться и убрать память, и программа вылетает с OutOfMemoryException. Я так раз пять уже вляпался, каждый раз приходилось менять архитектуру и переписывать на быдлокод, не создающих временных объектов.
Еще я пытаюсь все вычисления проводить в кеше, но на практике особой пользы это не приносит, так как в программу постоянно врывается GC, который портит весь кеш. И в итоге все тормозит :(
В общем, для нетривиальных вычислений GC не подходит абсолютно.
P.S. Для меланхоличного энтерпрайза GC приемлем, тут не спорю.


Простите, накипело >_<
0
AnyOne697
14.04.2013, 19:19
  #8

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
не создается ли при a * b временный объект, и если создается, то не слишком ли часто.
Насколько я помню, в шарпах есть конструкция using ( ... ) {}, после которой точно вызывается Dispose(), а GC получает приказ удалить всё using ( здесь ) {}.
Алсо, нередко можно использовать ленивые вычисления.

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.04.2013, 19:24 9
Цитата Сообщение от metaluga145 Посмотреть сообщение
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться?
Что не ясного? Если ты удалил массив, то уже не указывает.

Добавлено через 2 минуты
Цитата Сообщение от AnyOne697 Посмотреть сообщение
А вообще, это почти вечная проблема таких компилируемых в машинный код языков программирования.
Разве? Вот же:
Цитата Сообщение от AnyOne697 Посмотреть сообщение
программист сам работает с памятью.
, что исключает проблему.
0
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
14.04.2013, 19:28 10
Цитата Сообщение от taras atavin Посмотреть сообщение
что исключает проблему
Вот оно то что! Спасибо! Вы открыли мне глаза! А я думал, где там грёбнная утечка... Теперь-то я знаю, что я должен всё делать сам. Придётся переделывать архитектуру, переписывать over 9k строк кода, переосмысливать поведение тредов. Ещё раз спасибо!
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.04.2013, 19:37 11
Цитата Сообщение от diagon Посмотреть сообщение
каких таких компилируемых? ) не слышал чтобы подобные проблемы были скажем в haskell
за окном на минутку уже 2013, а вы всё о указателях, allacator-ах, счётчиках ссылок, как в 70-х... пора уже доверить это аппаратуре, и boost'овские умные указатели, согласен хороший способ, но не идиальный
Какая аппаратура? Давно уже не 60-й год, чтоб мечтать о сверхразумной аппаратуре, которая не зная ни замысла, ни текста реализации разберёт представление данных, чтоб понять, где валяются указатели и какие из них уже не нужны, пора уже взять ответственность за память на себя.

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
В общем случае - никак.
То есть слово "элементарно" теперь так изменилось?

Добавлено через 1 минуту
Цитата Сообщение от AnyOne697 Посмотреть сообщение
А я думал, где там грёбнная утечка... Теперь-то я знаю, что я должен всё делать сам. Придётся переделывать архитектуру, переписывать over 9k строк кода, переосмысливать поведение тредов. Ещё раз спасибо!
Покажи, как ты её вообще получишь. Конечно, когда ТС берётся писать, то его и ссылки не спасут, потому что он даже себя не понимает. Ну так эта проблема лечится включением головы.
0
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
14.04.2013, 19:42 12
Цитата Сообщение от taras atavin Посмотреть сообщение
Какая аппаратура? Давно уже не 60-й год, чтоб мечтать о сверхразумной аппаратуре, которая не зная ни замысла, ни текста реализации разберёт представление данных, чтоб понять, где валяются указатели и какие из них уже не нужны, пора уже взять ответственность за память на себя.
Не всегда и не совсем. Принцип работы умных указателей очень и очень прост: есть объект, у него есть поле, считающее количество ссылок на него. Если поле внезапно равно нулю - удаляем объект как недоступный.
В Си++ доступна адресная арифметика, поэтому так просто сделать не получиться. Но если использовать только векторы и их интерфейсы (и итераторы для обхода), то можно использовать (осторожно) и умные указатели.
Впрочем, я сейчас цитирую гения, наверное. Он ведь ни разу не ошибается и очень легко локализует в проекте из 20-30 модулей утечку.
0
diagon
14.04.2013, 19:47
  #13

Не по теме:

Цитата Сообщение от AnyOne697 Посмотреть сообщение
после которой точно вызывается Dispose()
Ээ, она не связана с освобождением памяти. Хотя, в случае с моим MPZInteger можно перенести освобождение памяти из деструктора в Dispose, но тогда появится множество утечек, потому что писать using/dispose для каждого экземпляра немного муторно. А связка using + GC.SuppressFinalize() довольно сильно бьет по перформансу.
Цитата Сообщение от AnyOne697 Посмотреть сообщение
а GC получает приказ удалить всё using ( здесь ) {}
Вы уверены? В шарпе таки немногое другое понятие скоупа, чем в плюсах. Вроде как там ссылки отвязываются от объекта только в конце метода(даже если имя объекта, к которому они привязаны, видно только в начале метода).

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.04.2013, 19:51 14
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Не всегда и не совсем. Принцип работы умных указателей очень и очень прост: есть объект, у него есть поле, считающее количество ссылок на него. Если поле внезапно равно нулю
и как же оно станет равно нулю?

Добавлено через 2 минуты
Цитата Сообщение от AnyOne697 Посмотреть сообщение
удаляем объект как недоступный.
Оставляя мусор в указателях. Спасибо, а я то думал: как сделать максимально глупый указатель? Так вот же оно! Объект должен просто исчезнуть по собственной инициативе.

Добавлено через 59 секунд
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Он ведь ни разу не ошибается и очень легко локализует в проекте из 20-30 модулей утечку.
Объясни, как её вообще получить, а то я ни разу не видел такого чуда.
0
AnyOne697
14.04.2013, 20:54
  #15

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
Вы уверены?
Нет, не уверен. Но если почитать то, что по ссылке, то именно для этого и был придуман этот механизм - дабы получить некоторый контроль надо памятью. Производительность да, будет ниже, так как потребуется каждый раз чистить мусор. Но ничего не поделаешь.

taras atavin, вы либо тролль, либо не понимаете принципы работы GC. Когда удаляется указатель, тогда и декрементируется счётчик. Указателя нет, соответственно не к чему и обратиться.

0
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
14.04.2013, 21:00 16
Давно уже не 60-й год, чтоб мечтать о сверхразумной аппаратуре, которая не зная ни замысла, ни текста реализации разберёт представление данных, чтоб понять, где валяются указатели и какие из них уже не нужны, пора уже взять ответственность за память на себя.
что-то вы не в теме

полистайте это - http://eax.me/why-haskell/

в языке не надо указателей, в языке не надо реализации алгоритмов (там даже циклов то нет), в языке не надо думать про память и помнить где и что валяется в памяти

всё есть и всё работает... фантастика тут не причём
0
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
14.04.2013, 22:11 17
Цитата Сообщение от abit Посмотреть сообщение
полистайте это - http://eax.me/why-haskell/
Haskell хорошая вещь, но 1) очень и очень требовательная к ресурсам; конечно, если есть овер дофига рам и сотня другая процессоров, то хэскелл вне конкуренции, но обычно это не так; к тому же, можно написать куда оптимально использующее ресурсы приложение на Си++/Java/C#, 2) да и проще это, надо сказать .
Стоит учитывать особенности Haskell, да, некоторые задачи с учётом его особенностей решаются на раз-два, да и эффективность в этих случаях колосальная и не сильно отличается от, с куда сложной архитектурой, уже целого программного комплекса написанного на Си. Но, таких задач мало и они нередко носят чисто научный характер с минимальной практической пользой. К превеликому сожалению.
0
14.04.2013, 22:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2013, 22:11
Помогаю со студенческими работами здесь

Копия того на что указывает указатель
Добрый вечер, форумчане. Возникла такая проблема template&lt;class Figure&gt; class t_node {...

Указатель указывает на несуществующую переменную, но выводит значение
Вот такой пример нашел в учебнике. В описании сказано, что локальные переменные функции...

В нескольких потоках указатель указывает на одну и ту же область памяти
Доброго времени суток форумчане. Столкнулся со следующей проблемой: при выделении памяти под...

Как создать копию объекта на который указывает указатель
У меня есть указатель класс Student, который хранит информацию о студентах(имя, фамилию, телефон) в...

Как изменить тип объекта, на который указывает указатель?
Есть абстрактный базовый класс и два производных: class Base { protected: int A; }; class...

Как вывести адресс на который указывает указатель типа char*.
Эта программа : #include &lt;iostream&gt; using namespace std; int main() { int a={1, 2, 3, 4};...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru