Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15

про кучу и не кучу

11.07.2011, 21:49. Показов 2647. Ответов 17

Студворк — интернет-сервис помощи студентам
уважаемые подскажите плиз, есть ли точный способ отличить по указателю, расположен объект в куче или нет, был ли он создан операцией new и можно ли к нему применить delete или нет?
первое что приходит в голову это адрес указателя. но так ли это? подскажите плиз
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2011, 21:49
Ответы с готовыми решениями:

Массив указателей на кучу векторов
нужно создать n - ое количество векторов. Как их объявить??? подскажите плиз)))))

Выводит кучу мусора в файл
В общем, програма должна вывести в файл все строки исходного файла, в которых есть подстрока "Hello!" #include <cstdio> ...

Как собрать файлы в кучу?
В книге Страуструпа для начинающих, в 8 главе квест, на создание заголовочного файла, и два сpp файла тк вот В папке с...

17
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
11.07.2011, 22:00
Вы скакой целью интересуетесь???
что приходит в голову
сравниваем адрес локальной переменной и куда указывает указатель
если рядом то точно стек
потом сравнить с какой нибудь глобальной если рядом то глобальная
иначе куча
Цитата Сообщение от AzaKendler Посмотреть сообщение
первое что приходит в голову это адрес указателя
указатель может лежать где угодно это же не выделенная память

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

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

ну а теоретически, зачем нужно? например есть некий класс принимающий указатель, захватывающий его так сказать. этот класс должен понимать можно и нужно ли делать delete по адресу принятого указателя, чтобы очистить его или это авто переменная. как то так.....
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
11.07.2011, 22:28
Цитата Сообщение от AzaKendler Посмотреть сообщение
ну а теоретически, зачем нужно? например есть некий класс принимающий указатель, захватывающий его так сказать. этот класс должен понимать можно и нужно ли делать delete по адресу принятого указателя
удалять должен тот кто вызывал иначе можешь огрести
например
CFrameWnd создается динамически попробуй создать в стеке и получишь аварийный выход
потому что в деструторе(по моему) стоит
delete this
надо анализировать PE заголовок там все есть и где стек и куча и глобальные переменные
но когда пишешь прогу его еще нет а потом твой анализ никому не нужен.

Цитата Сообщение от AzaKendler Посмотреть сообщение
делать delete по адресу принятого указателя
а почему delete а не delete[] или free
как ты это узнаешь по указателю даже если будешь знать что он в куче?
1
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
11.07.2011, 22:35  [ТС]
мда, вопрос обрастает как снежный ком...согласен, слишком много но. а если тогда отбросить операции удаления. то каков алгоритм поиска отличия? сравнение с авто и статик переменными и если не+-(сколько?) значений то - куча?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
11.07.2011, 22:41
Цитата Сообщение от AzaKendler Посмотреть сообщение
равнение с авто и статик переменными и если не+-(сколько?) значений то - куча?
наверно да
никогда не заморачивался только сейчас придумал
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
11.07.2011, 22:44
Цитата Сообщение от AzaKendler Посмотреть сообщение
уважаемые подскажите плиз, есть ли точный способ отличить по указателю, расположен объект в куче или нет, был ли он создан операцией new и можно ли к нему применить delete или нет?
первое что приходит в голову это адрес указателя. но так ли это? подскажите плиз
По указателю это определить нельзя. Указатель не содержит НИКАКОЙ информации о способе создания объекта.
1
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
11.07.2011, 22:45  [ТС]
ValeryLaptev, а как можно?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
11.07.2011, 22:57
Лучший ответ Сообщение было отмечено как решение

Решение

Мейерс в книге "Наиболее эффективное использование C++" в правиле 27 затрагивает этот вопрос, касательно объектов. И хотя он так же говорит об отсутствии способов определить, находится он в куче или нет, тем не менее там же приводится описание идеи, как можно реализовать проверку возможности удаления объекта (с использованием функции operator delete)
Раз интерес есть, то думаю есть смысл почитать.
5
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
11.07.2011, 23:02  [ТС]
ок. книга есть. просто пока учу стандарт. почитаемс. спасибо.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
11.07.2011, 23:24
почитали
Цитата Сообщение от grizlik78 Посмотреть сообщение
Мейерс в книге "Наиболее эффективное использование C++"
интересно
но там говориться о создании классов которые нельзя разместить на стеке или в куче
а здесь об определении каково-то указателя куда он указывает

Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
проверку возможности удаления объекта
непереносимую
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
11.07.2011, 23:44
Цитата Сообщение от ValeryS Посмотреть сообщение
интересно
но там говориться о создании классов которые нельзя разместить на стеке или в куче
а здесь об определении каково-то указателя куда он указывает
Там сходная цель, это главное.

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

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

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

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

Добавлено через 2 минуты
и кстати обрати внимание, что если ты запихал туда указатель выделенный с помощью new[] то ты сразу попадёшь в область неопределённого поведения. В самом лучшем случае пройзойдёт утечка памяти
2
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
12.07.2011, 11:07
Цитата Сообщение от pito211 Посмотреть сообщение
и кстати обрати внимание, что если ты запихал туда указатель выделенный с помощью new[] то ты сразу попадёшь в область неопределённого поведения. В самом лучшем случае пройзойдёт утечка памяти
Для этого предусмотрен boost::shared_array, так что и пихать, что попало в std::auto_ptr нет необходимости.
1
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
12.07.2011, 13:49  [ТС]
в общем если подводить итог моего вопроса и полученных ответов, то вырисовывается следующее.
Сделать класс который может сам принимать решение - что вызывать delete, delete [], free или вообще не вызывать - практически невозможно, в любом случае он не сможет гарантировать стабильной работы.
Определить где создан объект по указателю - невозможно. умные указатели, подразумевают работу с объектами созданными определенным образом, т.е. уже предполагается некая информация на входе. например то что пользователь создал объект при помощи new. Большое всем спасибо за ответы. Узнал много нового
0
Заблокирован
12.07.2011, 16:14
Цитата Сообщение от AzaKendler Посмотреть сообщение
например то что пользователь создал объект при помощи new
Обычно же как делается:
Некая сущность отвечает за создание объектов.
Эта сущность знает, как именно нужно создать объект, и как его скормить умному указателю.
А наружу уже выдаётся проинициализированный умный указатель.

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

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

И ему глубоко фиолетова, как он в нём оказался. Теперь можно скормить этот указатель клиентскому коду, и этому коду будит глубоко фиолетова кто и как отвечает за время жизни объекта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2011, 16:14
Помогаю со студенческими работами здесь

Помогите написать кучу задач
Тема : Функції 1. Дано одновимірний масив, заповнений 0 і 1 у довільному порядку. Відсортувати даний масив таким чином, щоб всі нулі...

Iostream выбивает кучу ошибок
При подключении библиотеки "iostream" выбивает около 150 ошибок. Как вариант возможно что то случилось с самой библиотекой. И если я...

Реализовать бинарную кучу на базе указателей
И всем доброго времени суток, форумчане! Ситуация следующая. Реализовать бинарную кучу на базе указателей с тремя методами: добавление...

Оператор присваивания для объектов на кучу
Как использовать оператор присваивания для объектов на куче, допустимо ли такое? T* v1 = new T; T* v2 = new T; v2->operator=(*v1);...

Нужно 2 кода слепить в кучу (деревья)
нужно 2 кода слепить в кучу...чтоб получилось что-то существенное...ато я не понимаю....помогите кому не сложно....:-| #include...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru