3 / 3 / 0
Регистрация: 13.09.2013
Сообщений: 38
|
||||||
1 | ||||||
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением04.10.2013, 18:39. Показов 1175. Ответов 14
Метки нет (Все метки)
Доброго времени суток.
В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти. В свете этого у меня возник вопрос об освобождении памяти, использованной таким образом. Пусть, к примеру, у меня имеется некоторый массив объектов char (выделенный ранее динамически) и указывающий на адрес, по которому вдруг потребовалось разместить объект некоторого класса A. На вскидку, мне видится три возможных варианта освобождения памяти. В коде ниже показываю все три варианта. В каждом из них происходит вызов деструктора, но я сомневаюсь, в каждом ли из них производится освобождение памяти... Интуитивно считаю, что в третьем варианте память должна освобождаться (деструктор там я вызываю вручную, иначе он не будет вызван). Оператору delete указываю "родной" указатель типа char, которому и была изначально выделена память. Но вот первый и второй вариант... С одной стороны, я использовал new, а с другой - я ведь не выделял новую память, а указал адрес уже выделенной ранее... Вот что в данном случае происходит? Происходит ли освобождение памяти, или же всё ограничивается банальным вызовом деструктора без последующего освобождения памяти? Как можно определить, произошло ли освобождение памяти? Может какой инструмент для этого имеется в GCC и MSVisual Studio 2012?
0
|
04.10.2013, 18:39 | |
Ответы с готовыми решениями:
14
Размещение объекта в памяти Динамическое выделение памяти для объекта класса Проблаем с освобождением памяти мышь в определённом месте |
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
||||||
04.10.2013, 18:47 | 2 | |||||
не понял сути вопроса...
у нас есть блок памяти char A[512]; если мы хотим использовать этот же блок под класс делаем так
0
|
3 / 3 / 0
Регистрация: 13.09.2013
Сообщений: 38
|
|
04.10.2013, 18:52 [ТС] | 3 |
Я в курсе и спрашивал о другом. В обозначенном мною варианте объект создаётся конструктором, поскольку зачастую экземпляры классов создаются именно так. Затем я показал три варианта освобождения ранее использовавшейся памяти. Вопрос был о том, насколько допустимы в использовании эти три варианта.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
04.10.2013, 20:49 | 4 |
Рабочий только третий вариант. Остальные- неопределенное поведение, так как память, выделенная оператором new, может быть освобождена только соответствующим оператором delete.
Кстати в первом варианте проверка if (!x) лишняя. delete прекрасно работает с нулевыми указателями.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
04.10.2013, 20:58 | 6 |
5.3.5.2
if the value of the operand of delete is the null pointer the operation has no effect Ну ты почитай вначале стандарт-то.
1
|
castaway
|
04.10.2013, 21:05
#7
|
Не по теме: Действительно. Не знаю почему у меня в голове это было заложено..
0
|
3 / 3 / 0
Регистрация: 13.09.2013
Сообщений: 38
|
|
04.10.2013, 21:12 [ТС] | 8 |
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
04.10.2013, 21:19 | 9 |
Точно, никакого) Но зато castaway теперь в курсе, что стандартом то гарантировано)
В общем я слишком бегло читаю код и всегда считал признаком хорошего тона числа на ноль проверять сравнением явно == 0. ! лучше проверять булевы или накрайняк указатели.
0
|
3 / 3 / 0
Регистрация: 13.09.2013
Сообщений: 38
|
|
04.10.2013, 21:22 [ТС] | 10 |
Мне более импонирует форма, предложенная Стровструпом (которую я и использовал в коде). На вкус и цвет, все фломастеры разные.
Вопрос снят: почитал про "placement new".
0
|
1 / 1 / 1
Регистрация: 10.04.2013
Сообщений: 41
|
|
04.10.2013, 21:27 | 11 |
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
04.10.2013, 21:35 | 13 |
+ это может быть разделяемая память
+ может хочется хранить определенные объекты разных типов рядом друг с другом, чтобы избежать кэш-промахов
0
|
1 / 1 / 1
Регистрация: 10.04.2013
Сообщений: 41
|
|
04.10.2013, 21:44 | 14 |
Ну там же написано, что нужно удалить всего лишь оригинальный буфер.
Может сделаете доброе дело и поделитесь, что там прочитали и какой вариант истинно правильный?
0
|
3 / 3 / 0
Регистрация: 13.09.2013
Сообщений: 38
|
|
04.10.2013, 22:09 [ТС] | 15 |
0
|
04.10.2013, 22:09 | |
04.10.2013, 22:09 | |
Помогаю со студенческими работами здесь
15
Ошибка в функции с освобождением памяти Удаление задачи с освобождением памяти вывод строки в определённом месте Сохранение файла в определённом месте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |