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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.85
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
#1

delete void* - C++

04.02.2010, 15:33. Просмотров 3399. Ответов 24
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass{
public:
    int i;
};
 
void main()
{
    MyClass* MyObj = new MyClass;
    MyObj->i = 10;
    void* VoidLink = MyObj;
    delete VoidLink; // освободится ли память?
    std::cout << MyObj->i; // уже не 10
}
Освободит ли память "delete VoidLink;"? Просто хочется выделить под удаление ресурсов отдельную функцию, однако выделенные ресурсы локальны и не видны...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2010, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос delete void* (C++):

Где void? - C++
Скорее всего тема опять будет пустовать, но я таки попробую. if ( __SETP__(_AH &amp; 0x44, 0) ) v4f9ab0(0, 0,...

delete vs. delete [] - C++
Всем привет, в разница использования delete и delete ? я читал, что delete используется для освобождения массивов, а delete для...

Backspace и Delete - C++
функция обрабатывает ввод символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, –. По нажатию клавиши Esc ввод прекращается, и функция возвращает...

Ошибка при delete - C++
Здравствуйте, вылетает такая ошибка, почему? Указатель верный, до этого места все нормально работает

оператор delete у null - C++
Один человек говорил что опасно использовать такой код (delete к null указателю), ну или когда-то было опасно, и что желательно перед...

Ошибка E2044 - operator delete must return void - C++ Builder
Среда - С++ Builder 2006 Суть такова: Только начали изучать сишку. Выполняю домашку, нужно составить форму с кнопкой и вычисляемым...

24
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.02.2010, 15:38 #2
а ты уже попробовал? и что получается?
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
04.02.2010, 15:42  [ТС] #3
Ну я лично не шибко разбираюсь в освобождении памяти. Код выполняется без ошибок. Я не могу понять когда память освободилась верно, а когда нет. Но после delete объект уже не содержит корректные данные. С другой стороны чтобы освободить память наверное нужно знать сколько весит объект. Но может ли void* дать такую информацию я не понимаю...
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.02.2010, 15:54 #4
память, думаю, освобождается. интересно, вызывается ли деструктор при таком удалении? можешь туда MessageBox (NULL, "kuku", "kuku", MB_OK|MB_TASKMODAL); вставить и посмотреть, выпрыгнет ли? если выполнить в дибаггере, выдает ли сообщение об утечках памяти после завершения?

Добавлено через 2 минуты
да, сам экземпляр твоего объекта занимает sizeof (MyClass) байт памяти. но он может еще где-то память аллокировать, которая освобождается, например, в деструкторе. этот момент подробнее нужно изучить.
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
04.02.2010, 16:01  [ТС] #5
Да я и так всегда в дебаге сижу (MS VS 2008). Ошибок нет. Деструктор не вызвался Плохо это... значит так можно сгребать в мусор только объекты для которых не нужен деструктор. Однако ещё не факт. Осталось понять освобождается ли память...

Добавлено через 2 минуты
C++
1
2
    delete VoidLink;
    delete MyObj;
Если сделать так то дебаггер уже ругается. Останавливается в dbgdel.cpp на строчке
C++
1
2
             /* verify block type */
            _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
Правда я слабо понимаю что это значит. Видимо все таки void* освободил ресурсы и повторное их освобождение вызывает исключение.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 412
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
04.02.2010, 16:09 #6
Память освободится, поскольку для освобождения памяти требуется знать только адрес участка (а его размер при выделении спрятан где-то в таблицах и записан в момент вызова new). При этом код у тебя работает в первую очередь потому, что так расположены звёзды (а точнее потому, что так реализована система run-time поддержки). Деструктор вызывается для того типа, какой имеет параметр delete. В твоём случае параметр имеет тип void*, поэтому никакого деструктора вызываться не будет. Если написать "delete (MyClass*)VoidLink", то вызовется класса MyClass
1
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
04.02.2010, 16:19  [ТС] #7
Короче говоря для Windows я могу так писать без опасений? (В случае если деструктор объекта не важен)
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 412
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
04.02.2010, 16:26 #8
Я не могу тебе ответить наверняка на твой вопрос, потому что всё это зависит от реализации run-time поддержки в конкретном компиляторе. Хрен его не знает, что там получается при множественном виртуальном наследовании и как там вообще делается каст от указателя на "средний" класс в цепочке с множественным виртуальным наследованием к указетлю на void*

Я просто не могу толком понять, зачем это тебе нужно?
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
04.02.2010, 16:29  [ТС] #9
Я просто хотел сделать прослойку выделения памяти которая собирала бы все созданные в функции указатели в массив void* а по завершению их удаляла. Впрочем я как всегда извращаюсь, но эксперементировать это интересно. По крайне мере без любопытсва человечество бы осталось в каменном веке) Думаю все же конкретно от этого я откажусь раз тут все так на удачу
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 412
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
04.02.2010, 16:33 #10
Забудь на минуту про удаление памяти. Опишина словах или на конкретном примере, как у тебя внешне будет выглядеть выделение памяти. Т.е. сделали new, а потом ручками дописали указатель к списку? А что делать, если у нас в середине процедуры стоит return, или throw? И какой смысл всего этого деяния: просто поэкспериментировать или сделать что-то полезное? Если что-то полезное, то зачем такая полезность с ограничением, что не вызывается деструктор (т.е. 99% случаев попадает под ограничение)?
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
04.02.2010, 16:40  [ТС] #11
Забудь на минуту про удаление памяти. Опишина словах или на конкретном примере, как у тебя внешне будет выглядеть выделение памяти. Т.е. сделали new, а потом ручками дописали указатель к списку?
Пожалуй...
Ну у списка есть дестуктор, он освободит ресурсы там.
И какой смысл всего этого деяния: просто поэкспериментировать или сделать что-то полезное?
Полезность была бы в том что мне не пришлось бы следить за delete однако я понял что не выйдет (из за деструкторов). В принципе да, мне просто было интересно было разобраться в этом вопросе, теперь я немного лучше понимаю про удаление памяти благодаря вам В общем delete void* делать не стоит)
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 412
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
04.02.2010, 16:46 #12
> Ну у списка есть дестуктор, он освободит ресурсы там

Ответ неверный. Собственно одно из стандартных заблуждений. Когда ты пишешь

C++
1
MyClass* MyObj = new MyClass;
то реально в этом месте делаются сразу два дейстия: выделение памяти и вызов конструктора. Конструктор память НЕ выделает, он только инициализирует поля. Т.е. этот код эквивалентен (по своей сути):

C++
1
2
MyClass* MyObj = (MyClass*) malloc (sizeof (MyClass));
MyObj->MyClass(); // условно обозначил вызов конструктора, как будто бы он есть процедура
Аналогично работает delete: сначала вызывается деструктор, а потом делается освобождение памяти. Чтобы вызвать деструктор, нужно знать тип, куда ссылается указатель (чтобы вызвать деструктор того класса, которым является объект). Чтобы освободить память, ничего кроме адреса знать не нужно, поскольку информация о размере выделенной памяти была записана в скрытых местах в момент вызова malloc'а
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
04.02.2010, 16:53  [ТС] #13
ну если бы были объекты для который не нужен деструктор то можно было бы сделать так?
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
04.02.2010, 16:56 #14
Цитата Сообщение от insideone Посмотреть сообщение
Я просто хотел сделать прослойку выделения памяти которая собирала бы все созданные в функции указатели в массив void* а по завершению их удаляла. Впрочем я как всегда извращаюсь, но эксперементировать это интересно. По крайне мере без любопытсва человечество бы осталось в каменном веке) Думаю все же конкретно от этого я откажусь раз тут все так на удачу
Для того что бы не заморачиваться с выделением/освобождением памяти есть std::auto_ptr
Что бы хранить массивы объектов есть куча контейнеров (для примера std::vector), при разрушении которого будут вызваны соотв. деструкторы объектов, помещенных в контейнер.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
04.02.2010, 17:10 #15
insideone, вместо довольно бессмысленных таки экспериментов рекомендовал бы потратить свободное время более целесообразным (с моей точки зрения, конечно) образом: погуглить по именам авторов Элджер, Мейерс, Саттер, Александреску, Джосаттис (иногда пишут Джосьютис) и скачать и почитать их книги (ну или погуглить Alger, Mayers, Sutter, Josuttis, Alexandresku.....)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2010, 17:10
Привет! Вот еще темы с ответами:

Как написать это - void fastcall TForml:oOp(void)? - C++ Builder
Добрый день! Подскажите пожайлуста: Как написать это - void fastcall TForml:: DoOp(void)? Как выставить? Не могу найти... ...

Void To Bool - C++ Builder
Как можно void преобразовать в bool? if(Skype1-&gt;Attach(6, VARIANT_TRUE)) { ShowMessage(&quot;ERROR&quot;); } Не работает. Cannot convert...

Приведение к void - C++ Builder
Приветствую. Как правильно в С++ привести данные к типу void? int Data; void *ptrData; ptrData = &amp;Data; // Так правильно? ...

delete или new (typeid(void*))(void*) - C++
Доброе время суток. Пишу список. Телом каждого элемента (el) списка является void указатель(body). (предполагается что тело элемента...


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

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

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