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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

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

11.07.2011, 21:49. Просмотров 1250. Ответов 17

уважаемые подскажите плиз, есть ли точный способ отличить по указателю, расположен объект в куче или нет, был ли он создан операцией new и можно ли к нему применить delete или нет?
первое что приходит в голову это адрес указателя. но так ли это? подскажите плиз
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2011, 21:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос про кучу и не кучу (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
11.07.2011, 22:00 #2
Вы скакой целью интересуетесь???
что приходит в голову
сравниваем адрес локальной переменной и куда указывает указатель
если рядом то точно стек
потом сравнить с какой нибудь глобальной если рядом то глобальная
иначе куча
Цитата Сообщение от AzaKendler Посмотреть сообщение
первое что приходит в голову это адрес указателя
указатель может лежать где угодно это же не выделенная память

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

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

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

Цитата Сообщение от AzaKendler Посмотреть сообщение
делать delete по адресу принятого указателя
а почему delete а не delete[] или free
как ты это узнаешь по указателю даже если будешь знать что он в куче?
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 22:35  [ТС] #5
мда, вопрос обрастает как снежный ком...согласен, слишком много но. а если тогда отбросить операции удаления. то каков алгоритм поиска отличия? сравнение с авто и статик переменными и если не+-(сколько?) значений то - куча?
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
11.07.2011, 22:41 #6
Цитата Сообщение от AzaKendler Посмотреть сообщение
равнение с авто и статик переменными и если не+-(сколько?) значений то - куча?
наверно да
никогда не заморачивался только сейчас придумал
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.07.2011, 22:44 #7
Цитата Сообщение от AzaKendler Посмотреть сообщение
уважаемые подскажите плиз, есть ли точный способ отличить по указателю, расположен объект в куче или нет, был ли он создан операцией new и можно ли к нему применить delete или нет?
первое что приходит в голову это адрес указателя. но так ли это? подскажите плиз
По указателю это определить нельзя. Указатель не содержит НИКАКОЙ информации о способе создания объекта.
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 22:45  [ТС] #8
ValeryLaptev, а как можно?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
11.07.2011, 22:57 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Мейерс в книге "Наиболее эффективное использование C++" в правиле 27 затрагивает этот вопрос, касательно объектов. И хотя он так же говорит об отсутствии способов определить, находится он в куче или нет, тем не менее там же приводится описание идеи, как можно реализовать проверку возможности удаления объекта (с использованием функции operator delete)
Раз интерес есть, то думаю есть смысл почитать.
5
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
11.07.2011, 23:02  [ТС] #10
ок. книга есть. просто пока учу стандарт. почитаемс. спасибо.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
11.07.2011, 23:24 #11
почитали
Цитата Сообщение от grizlik78 Посмотреть сообщение
Мейерс в книге "Наиболее эффективное использование C++"
интересно
но там говориться о создании классов которые нельзя разместить на стеке или в куче
а здесь об определении каково-то указателя куда он указывает

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

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

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

Правило очень простое: Удаляет объект тот, кто его создавал. Потому что, он знает точно, как это сделать правильно. В противном случае, это хороший повод ещё раз пересмотреть архитектуру.
2
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 сам создает копию и сам ее разрушает, но как он уничтожает МОЮ изначальную копию в куче?Либо если копия не создается, то как он может уничтожить объект о создании которого не знает ничего? Ведь во время данного процесса я удаления не касаюсь.
Извиняюсь заранее если написал глупость, но спросил то, что непонятно.
0
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[] то ты сразу попадёшь в область неопределённого поведения. В самом лучшем случае пройзойдёт утечка памяти
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2011, 09:18
Привет! Вот еще темы с ответами:

Проверить, может ли массив представлять бинарную кучу - C++
Задан массив из N чисел. Необходимо проверить, может ли он представлять бинарную кучу.

как можно разбить на группы кучу переменных? - C++
пишу прогу которая высчитывает разную статистику и в ней переменных штук 30.. например int iOrdersLoss int iOrdersProfit int...

как написать функцию возвращающую объект с указателем на кучу - C++
уперся в следующее: есть класс содержащий в себе указатель на динамическую память (кучу). В общем-то это массив размерность которого...

Напечатать список товаров в алфавитном порядке используя двоичную кучу - C++
Написать программу с помощью двоичной кучи. С клавиатуры вводится количество товара, наименование товара, единица измерения, цена за...


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

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

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