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

про кучу и не кучу - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 21:49     про кучу и не кучу #1
уважаемые подскажите плиз, есть ли точный способ отличить по указателю, расположен объект в куче или нет, был ли он создан операцией new и можно ли к нему применить delete или нет?
первое что приходит в голову это адрес указателя. но так ли это? подскажите плиз
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
11.07.2011, 22:00     про кучу и не кучу #2
Вы скакой целью интересуетесь???
что приходит в голову
сравниваем адрес локальной переменной и куда указывает указатель
если рядом то точно стек
потом сравнить с какой нибудь глобальной если рядом то глобальная
иначе куча
Цитата Сообщение от AzaKendler Посмотреть сообщение
первое что приходит в голову это адрес указателя
указатель может лежать где угодно это же не выделенная память

но зачем енто ???
если при выполнении то по моему не нужно
а если при написании
че ж ты не помнишь как переменные объявлял?

Добавлено через 1 минуту
Цитата Сообщение от AzaKendler Посмотреть сообщение
операцией new
а если malloс то тоже куча но delete не применим
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 22:13  [ТС]     про кучу и не кучу #3
где то читал что под стэк выделяется определенный объем по моему в верхних адресах. думал может как то от этого оттолкнуться.

ну а теоретически, зачем нужно? например есть некий класс принимающий указатель, захватывающий его так сказать. этот класс должен понимать можно и нужно ли делать delete по адресу принятого указателя, чтобы очистить его или это авто переменная. как то так.....
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
11.07.2011, 22:28     про кучу и не кучу #4
Цитата Сообщение от AzaKendler Посмотреть сообщение
ну а теоретически, зачем нужно? например есть некий класс принимающий указатель, захватывающий его так сказать. этот класс должен понимать можно и нужно ли делать delete по адресу принятого указателя
удалять должен тот кто вызывал иначе можешь огрести
например
CFrameWnd создается динамически попробуй создать в стеке и получишь аварийный выход
потому что в деструторе(по моему) стоит
delete this
надо анализировать PE заголовок там все есть и где стек и куча и глобальные переменные
но когда пишешь прогу его еще нет а потом твой анализ никому не нужен.

Цитата Сообщение от AzaKendler Посмотреть сообщение
делать delete по адресу принятого указателя
а почему delete а не delete[] или free
как ты это узнаешь по указателю даже если будешь знать что он в куче?
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 22:35  [ТС]     про кучу и не кучу #5
мда, вопрос обрастает как снежный ком...согласен, слишком много но. а если тогда отбросить операции удаления. то каков алгоритм поиска отличия? сравнение с авто и статик переменными и если не+-(сколько?) значений то - куча?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
11.07.2011, 22:41     про кучу и не кучу #6
Цитата Сообщение от AzaKendler Посмотреть сообщение
равнение с авто и статик переменными и если не+-(сколько?) значений то - куча?
наверно да
никогда не заморачивался только сейчас придумал
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.07.2011, 22:44     про кучу и не кучу #7
Цитата Сообщение от AzaKendler Посмотреть сообщение
уважаемые подскажите плиз, есть ли точный способ отличить по указателю, расположен объект в куче или нет, был ли он создан операцией new и можно ли к нему применить delete или нет?
первое что приходит в голову это адрес указателя. но так ли это? подскажите плиз
По указателю это определить нельзя. Указатель не содержит НИКАКОЙ информации о способе создания объекта.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 22:45  [ТС]     про кучу и не кучу #8
ValeryLaptev, а как можно?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
11.07.2011, 22:57     про кучу и не кучу #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Мейерс в книге "Наиболее эффективное использование C++" в правиле 27 затрагивает этот вопрос, касательно объектов. И хотя он так же говорит об отсутствии способов определить, находится он в куче или нет, тем не менее там же приводится описание идеи, как можно реализовать проверку возможности удаления объекта (с использованием функции operator delete)
Раз интерес есть, то думаю есть смысл почитать.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 23:02  [ТС]     про кучу и не кучу #10
ок. книга есть. просто пока учу стандарт. почитаемс. спасибо.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
11.07.2011, 23:24     про кучу и не кучу #11
почитали
Цитата Сообщение от grizlik78 Посмотреть сообщение
Мейерс в книге "Наиболее эффективное использование C++"
интересно
но там говориться о создании классов которые нельзя разместить на стеке или в куче
а здесь об определении каково-то указателя куда он указывает

Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
проверку возможности удаления объекта
непереносимую
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
11.07.2011, 23:44     про кучу и не кучу #12
Цитата Сообщение от ValeryS Посмотреть сообщение
интересно
но там говориться о создании классов которые нельзя разместить на стеке или в куче
а здесь об определении каково-то указателя куда он указывает
Там сходная цель, это главное.

Цитата Сообщение от ValeryS Посмотреть сообщение
непереносимую
И автор этого не скрывает. Я, собственно, и порекомендовал почитать, чтобы была ясна аргументация, что дело это непростое.
Bers
Заблокирован
12.07.2011, 01:29     про кучу и не кучу #13
Я себе даже примерно представить не могу, зачем такие пляски с бубном могут понадобиться...

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

Правило очень простое: Удаляет объект тот, кто его создавал. Потому что, он знает точно, как это сделать правильно. В противном случае, это хороший повод ещё раз пересмотреть архитектуру.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.07.2011, 08:51  [ТС]     про кучу и не кучу #14
может я сейчас глупость напишу. но как быть в случае с auto_ptr? Я создал объект в куче, далее его адрес у меня хранится в указателе и вот я передаю данный адрес к auto_ptr, насколько я понял происходит разрушающее копирование(т.е. мой указатель должен более не ссылаться на объект в куче), владение переходит к auto_ptr и, на выходе auto_ptr уничтожается. удаляя объект в куче. Понимаю что скорее всего внутри auto_ptr сам создает копию и сам ее разрушает, но как он уничтожает МОЮ изначальную копию в куче?Либо если копия не создается, то как он может уничтожить объект о создании которого не знает ничего? Ведь во время данного процесса я удаления не касаюсь.
Извиняюсь заранее если написал глупость, но спросил то, что непонятно.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
12.07.2011, 09:18     про кучу и не кучу #15
Цитата Сообщение от AzaKendler Посмотреть сообщение
и вот я передаю данный адрес к auto_ptr, насколько я понял происходит разрушающее копирование
разрушающее копирование происходит при копировании одного auto_ptr в другой. Тот указатель который ты передал в auto_ptr остаётся валидным

Добавлено через 7 минут
Цитата Сообщение от AzaKendler Посмотреть сообщение
но как он уничтожает МОЮ изначальную копию в куче?Либо если копия не создается, то как он может уничтожить объект о создании которого не знает ничего
у меня так определён деструктор
~auto_ptr() { delete _M_ptr; }
видимо в auto_ptr можно запихать только указатели для которых память выделялась с помощью new

Добавлено через 2 минуты
и кстати обрати внимание, что если ты запихал туда указатель выделенный с помощью new[] то ты сразу попадёшь в область неопределённого поведения. В самом лучшем случае пройзойдёт утечка памяти
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
12.07.2011, 11:07     про кучу и не кучу #16
Цитата Сообщение от pito211 Посмотреть сообщение
и кстати обрати внимание, что если ты запихал туда указатель выделенный с помощью new[] то ты сразу попадёшь в область неопределённого поведения. В самом лучшем случае пройзойдёт утечка памяти
Для этого предусмотрен boost::shared_array, так что и пихать, что попало в std::auto_ptr нет необходимости.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
12.07.2011, 13:49  [ТС]     про кучу и не кучу #17
в общем если подводить итог моего вопроса и полученных ответов, то вырисовывается следующее.
Сделать класс который может сам принимать решение - что вызывать delete, delete [], free или вообще не вызывать - практически невозможно, в любом случае он не сможет гарантировать стабильной работы.
Определить где создан объект по указателю - невозможно. умные указатели, подразумевают работу с объектами созданными определенным образом, т.е. уже предполагается некая информация на входе. например то что пользователь создал объект при помощи new. Большое всем спасибо за ответы. Узнал много нового
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2011, 16:14     про кучу и не кучу
Еще ссылки по теме:

Чем дальше в лес, тем больше дров. Не соображу, как собрать в кучу C++
Как собрать файлы в кучу? C++
C++ Требуется собрать кучу object в один контейнер и искать их по object_name

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
12.07.2011, 16:14     про кучу и не кучу #18
Цитата Сообщение от AzaKendler Посмотреть сообщение
например то что пользователь создал объект при помощи new
Обычно же как делается:
Некая сущность отвечает за создание объектов.
Эта сущность знает, как именно нужно создать объект, и как его скормить умному указателю.
А наружу уже выдаётся проинициализированный умный указатель.

Получается что-то вроде:

SmartPointer ptr = CreateObj(); //все, умный указатель уже владеет подопечным объектом.

И ему глубоко фиолетова, как он в нём оказался. Теперь можно скормить этот указатель клиентскому коду, и этому коду будит глубоко фиолетова кто и как отвечает за время жизни объекта.
Yandex
Объявления
12.07.2011, 16:14     про кучу и не кучу
Ответ Создать тему

Метки
память, указатели
Опции темы

Текущее время: 15:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru