Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/32: Рейтинг темы: голосов - 32, средняя оценка - 4.78
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550

delete void*

04.02.2010, 15:33. Показов 6508. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2010, 15:33
Ответы с готовыми решениями:

Перенаправление из Void в другой Void
Решил я значит сделать себе терминал как в Fallout,и столкнулся с такой проблемой,из void нельзя перенаправить в другой void,из за этого у...

Void * processor to (void(Args.) (*processor)
Здравствуйте. Имеем void* значением которого является адрес функции. Как скастить этот указатель в указатель на функцию? ...

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

24
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.02.2010, 15:38
а ты уже попробовал? и что получается?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 15:42  [ТС]
Ну я лично не шибко разбираюсь в освобождении памяти. Код выполняется без ошибок. Я не могу понять когда память освободилась верно, а когда нет. Но после delete объект уже не содержит корректные данные. С другой стороны чтобы освободить память наверное нужно знать сколько весит объект. Но может ли void* дать такую информацию я не понимаю...
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.02.2010, 15:54
память, думаю, освобождается. интересно, вызывается ли деструктор при таком удалении? можешь туда MessageBox (NULL, "kuku", "kuku", MB_OK|MB_TASKMODAL); вставить и посмотреть, выпрыгнет ли? если выполнить в дибаггере, выдает ли сообщение об утечках памяти после завершения?

Добавлено через 2 минуты
да, сам экземпляр твоего объекта занимает sizeof (MyClass) байт памяти. но он может еще где-то память аллокировать, которая освобождается, например, в деструкторе. этот момент подробнее нужно изучить.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:01  [ТС]
Да я и так всегда в дебаге сижу (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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 16:09
Память освободится, поскольку для освобождения памяти требуется знать только адрес участка (а его размер при выделении спрятан где-то в таблицах и записан в момент вызова new). При этом код у тебя работает в первую очередь потому, что так расположены звёзды (а точнее потому, что так реализована система run-time поддержки). Деструктор вызывается для того типа, какой имеет параметр delete. В твоём случае параметр имеет тип void*, поэтому никакого деструктора вызываться не будет. Если написать "delete (MyClass*)VoidLink", то вызовется класса MyClass
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:19  [ТС]
Короче говоря для Windows я могу так писать без опасений? (В случае если деструктор объекта не важен)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 16:26
Я не могу тебе ответить наверняка на твой вопрос, потому что всё это зависит от реализации run-time поддержки в конкретном компиляторе. Хрен его не знает, что там получается при множественном виртуальном наследовании и как там вообще делается каст от указателя на "средний" класс в цепочке с множественным виртуальным наследованием к указетлю на void*

Я просто не могу толком понять, зачем это тебе нужно?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:29  [ТС]
Я просто хотел сделать прослойку выделения памяти которая собирала бы все созданные в функции указатели в массив void* а по завершению их удаляла. Впрочем я как всегда извращаюсь, но эксперементировать это интересно. По крайне мере без любопытсва человечество бы осталось в каменном веке) Думаю все же конкретно от этого я откажусь раз тут все так на удачу
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 16:33
Забудь на минуту про удаление памяти. Опишина словах или на конкретном примере, как у тебя внешне будет выглядеть выделение памяти. Т.е. сделали new, а потом ручками дописали указатель к списку? А что делать, если у нас в середине процедуры стоит return, или throw? И какой смысл всего этого деяния: просто поэкспериментировать или сделать что-то полезное? Если что-то полезное, то зачем такая полезность с ограничением, что не вызывается деструктор (т.е. 99% случаев попадает под ограничение)?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:40  [ТС]
Забудь на минуту про удаление памяти. Опишина словах или на конкретном примере, как у тебя внешне будет выглядеть выделение памяти. Т.е. сделали new, а потом ручками дописали указатель к списку?
Пожалуй...
Ну у списка есть дестуктор, он освободит ресурсы там.
И какой смысл всего этого деяния: просто поэкспериментировать или сделать что-то полезное?
Полезность была бы в том что мне не пришлось бы следить за delete однако я понял что не выйдет (из за деструкторов). В принципе да, мне просто было интересно было разобраться в этом вопросе, теперь я немного лучше понимаю про удаление памяти благодаря вам В общем delete void* делать не стоит)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 16:46
> Ну у списка есть дестуктор, он освободит ресурсы там

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

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

C++
1
2
MyClass* MyObj = (MyClass*) malloc (sizeof (MyClass));
MyObj->MyClass(); // условно обозначил вызов конструктора, как будто бы он есть процедура
Аналогично работает delete: сначала вызывается деструктор, а потом делается освобождение памяти. Чтобы вызвать деструктор, нужно знать тип, куда ссылается указатель (чтобы вызвать деструктор того класса, которым является объект). Чтобы освободить память, ничего кроме адреса знать не нужно, поскольку информация о размере выделенной памяти была записана в скрытых местах в момент вызова malloc'а
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:53  [ТС]
ну если бы были объекты для который не нужен деструктор то можно было бы сделать так?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
04.02.2010, 16:56
Цитата Сообщение от insideone Посмотреть сообщение
Я просто хотел сделать прослойку выделения памяти которая собирала бы все созданные в функции указатели в массив void* а по завершению их удаляла. Впрочем я как всегда извращаюсь, но эксперементировать это интересно. По крайне мере без любопытсва человечество бы осталось в каменном веке) Думаю все же конкретно от этого я откажусь раз тут все так на удачу
Для того что бы не заморачиваться с выделением/освобождением памяти есть std::auto_ptr
Что бы хранить массивы объектов есть куча контейнеров (для примера std::vector), при разрушении которого будут вызваны соотв. деструкторы объектов, помещенных в контейнер.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
04.02.2010, 17:10
insideone, вместо довольно бессмысленных таки экспериментов рекомендовал бы потратить свободное время более целесообразным (с моей точки зрения, конечно) образом: погуглить по именам авторов Элджер, Мейерс, Саттер, Александреску, Джосаттис (иногда пишут Джосьютис) и скачать и почитать их книги (ну или погуглить Alger, Mayers, Sutter, Josuttis, Alexandresku.....)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 17:13
Цитата Сообщение от insideone Посмотреть сообщение
ну если бы были объекты для который не нужен деструктор то можно было бы сделать так?
В теории да, но ограничения для этого я писал выше. Т.е. 100% гарантии, что это будет работать, скорее всего нет
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
04.02.2010, 17:17
вообще то в С++ приводить к void* это плохая практика... не для этого придумывалось ООП со своими наворотами.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.02.2010, 17:36
Цитата Сообщение от insideone Посмотреть сообщение
ну если бы были объекты для который не нужен деструктор то можно было бы сделать так?
тогда, наверное, стоит подумать, нужны ли такие объекты.

Добавлено через 3 минуты
Цитата Сообщение от oxotnik Посмотреть сообщение
Для того что бы не заморачиваться с выделением/освобождением памяти есть std::auto_ptr
Что бы хранить массивы объектов есть куча контейнеров (для примера std::vector), при разрушении которого будут вызваны соотв. деструкторы объектов, помещенных в контейнер.
если я правильно понял, то объекты - разных типов. т.е. опять же совать их в std::vector<void*> v ?
в деструкторе вектора удалится память только под вектор (под его четыре указателя, каквые составляют в большинстве реализаций сам вектор). а сами объекты, на которые указывали эти указатели, будут ждать освобождения памяти, выделенной под приложение.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
04.02.2010, 17:47
Цитата Сообщение от novi4ok Посмотреть сообщение
если я правильно понял, то объекты - разных типов. т.е. опять же совать их в std::vector v ? в деструкторе вектора удалится память только четырех указателей, каквые составляют в большинстве реализаций сам вектор. а сами объекты, на которые указывали эти указатели, будут ждать освобождения памяти, выделенной под приложение.
если делать так:
Code
1
2
3
CSomeClass *pSomeClass = new CSomeClass();
vector <CSomeClass*>v;
v.push_back(pSomeClass);
то естественно само ниче не удалится
а для разных типов можно сделать базовый шаблон
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
04.02.2010, 18:30
Можно такой фигни по навыдумывать..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <algorithm>
#include <iostream>
#include <vector>
 
 
class iref{
public:
    iref(iref* rhs):count(1) { vec.push_back(rhs); }
    virtual ~iref(){ count = 0; }
 
    virtual void release() { --count; if(!count)delete this; }  
    virtual void add()     { ++count; }
    //.......
    static void clear_all(){
        for(std::vector<iref*>::iterator i = vec.begin(); 
            i != vec.end(); 
            ++i)
            (*i)->iref::release();
        vec.clear();
    }
protected:
    int count;
    static std::vector<iref*> vec;
};
 
std::vector<iref*> iref::vec;
 
class a: public iref{
public:
    a(): iref(this) { std::cout << "a(): iref()"  << std::endl; }
    virtual ~a(){ std::cout << "~a(): iref()" << std::endl; }
 
    virtual void release() {
        --count; 
        if(!count){
            vec.erase(std::find(vec.begin(), vec.end(), this));
            delete this;
        }  
    }
};
 
class b: public iref{
public:
    b(): iref(this) { std::cout << "b(): iref()"  << std::endl; }
    virtual ~b(){ std::cout << "~b(): iref()" << std::endl; }
 
    virtual void release() {
        --count; 
        if(!count){
            vec.erase(std::find(vec.begin(), vec.end(), this));
            delete this;
        }  
    }
};
 
int main(){
    std::vector<iref*> v;
 
    a *a1 = new a;
    a *a2 = new a;
    a *a3 = new a;
    b *b1 = new b;
 
    b1->release();
    a1->release();
 
    iref::clear_all();
 
    return 0;
}
http://codepad.org/W1dNHGl0
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2010, 18:30
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru