Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
#1

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

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

Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться?
Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2013, 22:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Узнать указывает ли указатель (C++):

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

Указатель не указывает на CHAR - C++
Доброго всем здравия, совсем запутался, написал примитивный код, а он гад не работает. Как такое возможно? #include "stdafx.h" ...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
abit
263 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 730
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
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
14.04.2013, 03:35 #3
Алсо, можно юзать бустовские умные указатели. Их суть заключается, что вы удаляете не объект, а указатель на объект. Когда никто не указывает на объект - объект сам удаляется.

А вообще, это почти вечная проблема таких компилируемых в машинный код языков программирования. И не совсем понятно, почему. Факт остаётся фактом - программист сам работает с памятью. Более того, когда вы сделали delete, из RAM ничего не исчезнет, система лишь пометит этот кусок, как кусок пригодный для аллокатинга.
1
abit
263 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 730
14.04.2013, 04:41 #4
А вообще, это почти вечная проблема таких компилируемых в машинный код языков программирования.
каких таких компилируемых? ) не слышал чтобы подобные проблемы были скажем в haskell

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

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

и это как раз целая серверная система, ведущая в мире в области Cloud-технологий
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 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
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.04.2013, 19:24 #9
Цитата Сообщение от metaluga145 Посмотреть сообщение
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает ли указатель уже куда-то. Как с этим побороться?
Что не ясного? Если ты удалил массив, то уже не указывает.

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

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

Добавлено через 1 минуту
Цитата Сообщение от AnyOne697 Посмотреть сообщение
А я думал, где там грёбнная утечка... Теперь-то я знаю, что я должен всё делать сам. Придётся переделывать архитектуру, переписывать over 9k строк кода, переосмысливать поведение тредов. Ещё раз спасибо!
Покажи, как ты её вообще получишь. Конечно, когда ТС берётся писать, то его и ссылки не спасут, потому что он даже себя не понимает. Ну так эта проблема лечится включением головы.
0
AnyOne697
134 / 106 / 5
Регистрация: 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
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 20:54
Привет! Вот еще темы с ответами:

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

Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память - C++
Читаю уроки по C++ на форуме, почему то автор не хочет все нормально писать, в гугле ничего нормального не нашел, вот зачем в этой...

Узнать, куда указывает strstr - C++
Здравствуйте, у меня есть массив. С помощью STRSTR я проверяю его на наличие строки, но как мне на каком по счету элементе массива...

Узнать тип, на который указывает итератор - C++
Всем привет! Вот например у меня есть такой код: vector&lt;double&gt; objInt2; objInt2.push_back(1); objInt2.push_back(2); ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.04.2013, 20:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru