Решено: указатели void* (delete)

Модератор: Модераторы разделов

frp
Сообщения: 1445
ОС: Debian Squeeze

Решено: указатели void*

Сообщение frp »

Насколько правильный такой код:

Код: Выделить всё

//...
T* t1=new T;
//...
void* ptr=t1;
//...
delete ptr; // Корректна ли эта операция?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: указатели void*

Сообщение watashiwa_daredeska »

frp писал(а): ↑
31.07.2009 12:56
Корректна ли эта операция?
В каком смысле?
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: Решено: указатели void*

Сообщение whirlwind »

В таком случае память под сам обьект будет освобождена без проблем, но деструктор вызван не будет, что, естественно, плохо.

И, гугл находит поразительные вещи
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Решено: указатели void*

Сообщение sergio »

frp писал(а): ↑
31.07.2009 12:56

Код: Выделить всё

//...
T* t1=new T;
//...
void* ptr=t1;
//...
delete ptr; // Корректна ли эта операция?

Боюсь, не очень. delete-операция должна сперва вызвать деструктор, а при данном раскладе как она это будет делать?
Если дтор виртуальный, то можно делать делит через указатель на базовый класс. А здесь полностью потеряна информация о типе.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Решено: указатели void*

Сообщение Crazy »

Зачем указатель на void понадобился?

Desipere in loco
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Решено: указатели void*

Сообщение frp »

whirlwind писал(а): ↑
31.07.2009 14:09
В таком случае память под сам обьект будет освобождена без проблем, но деструктор вызван не будет, что, естественно, плохо.

Конечно плохо.

Хочу сделать простой сборщик мусора для C++. Со сборщиком мусора должны работать "умные" указатели (реализовано в виде шаблона). Они обращаются к сборщику мусора, который увеличивает и уменьшает счетчики ссылок. По таймеру раз в несколько секунд вызывается сборщик мусора, который удаляет все объекты, у которых значение счетчика ссылок 0. Как сделать нормальное удаление?

Есть еще идея нескольких сборщиков мусора (по одному на тип) - тогда сборщик можно сделать в виде шаблона, но увеличивается расход памяти и сложность работы.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Решено: указатели void*

Сообщение Crazy »

Тогда осмелюсь предложить создать диспетчер памяти. К примеру как в этой статье https://www.ibm.com/developerworks/ru/edu/a...ager/index.html
auto_ptr то же "умный" указатель.

Desipere in loco
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Решено: указатели void*

Сообщение frp »

Crazy писал(а): ↑
31.07.2009 15:28
Тогда осмелюсь предложить создать диспетчер памяти. К примеру как в этой статье https://www.ibm.com/developerworks/ru/edu/a...ager/index.html

Почитал. А чем мне поможет менеджер памяти в создании системы сборки мусора?
Crazy писал(а): ↑
31.07.2009 15:28
auto_ptr то же "умный" указатель.

Не настолько. И с реализацией умных указателей у меня нет проблем.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Решено: указатели void*

Сообщение Crazy »

frp твои предложения? Сборка мусора, одна из функций диспетчера памяти. Я не знаю для чего ты используешь динамическое выделение памяти, поэтому и предложил auto_ptr, который удаляет объект, после выхода из поля видимости. Все зависит от того, что нужно.

Desipere in loco
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Решено: указатели void*

Сообщение AestheteAnimus »

frp писал(а): ↑
31.07.2009 15:08
Со сборщиком мусора должны работать "умные" указатели (реализовано в виде шаблона). Они обращаются к сборщику мусора, который увеличивает и уменьшает счетчики ссылок. По таймеру раз в несколько секунд вызывается сборщик мусора, который удаляет все объекты, у которых значение счетчика ссылок 0. Как сделать нормальное удаление?

А таймер-то зачем? Надо удалять сразу, как счетчик ссылок стал равен 0. Этот http://loki-lib.sourceforge.net/ материал уже изучен?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: указатели void*

Сообщение drBatty »

AestheteAnimus писал(а): ↑
31.07.2009 16:46
А таймер-то зачем? Надо удалять сразу, как счетчик ссылок стал равен 0

можно и по таймеру... в этом есть смысл - процедура удаления очень быстрая (ведь она ничего не удаляет!)
поможет, если вы скажем выделяете и уничтожаете в цикле много одних и тех-же объектов (вместо стека LIFO).
написать-то такое просто... но отладить, и сопровождать - без меня, пожалуйста :)

frp писал(а): ↑
31.07.2009 16:00
А чем мне поможет менеджер памяти в создании системы сборки мусора?

как это?
сборка мусора - это один из вариантов менеджера памяти!
Срочно читать Кнута, Том2, насколько я помню.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Решено: указатели void*

Сообщение AestheteAnimus »

drBatty писал(а): ↑
31.07.2009 17:08
можно и по таймеру... в этом есть смысл - процедура удаления очень быстрая (ведь она ничего не удаляет!)
поможет, если вы скажем выделяете и уничтожаете в цикле много одних и тех-же объектов (вместо стека LIFO).

В этом случае можно и по таймеру... бр... ну такого выделения в цикле лучше избегать ;)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: указатели void*

Сообщение drBatty »

AestheteAnimus писал(а): ↑
31.07.2009 17:17
В этом случае можно и по таймеру... бр... ну такого выделения в цикле лучше избегать

дык - C++ коварная штука

Код: Выделить всё

TX sum = 0;
for ( i = 1; i <= 1000; i++)
{
 TX a = TX::read();
 sum += a;
}

что такого?
ничего.
а если TX это матрица 1000*1000?
а как работает TX::TX(TX&)?
а как TX::operator+=(TX&)?
так и получаются.. "титаники" в памяти... точнее "летучие голландцы" :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Решено: указатели void*

Сообщение frp »

Немного передумал насчёт сборки мусора. Теперь буду просто использовать умные указатели, которые будут освобождать память сразу после удаления. Всё уже реализовал. Тему можно закрывать.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: указатели void*

Сообщение NickLion »

Умные указатели не достаточно умные, чтобы побороть циклические ссылки. А в остальном, достаточно сообразительные :)
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Решено: указатели void*

Сообщение frp »

NickLion писал(а): ↑
31.07.2009 23:29
Умные указатели не достаточно умные, чтобы побороть циклические ссылки.

У меня как-то возникло подозрение, что в Mono и .NET это никак не решено и объекты остаются в памяти до завершения выполнения программы. В C++ и других языках для этого есть тупые указатели (а так же умные, проверяющие, что память не освобождена).
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Решено: указатели void*

Сообщение sergio »

frp писал(а): ↑
01.08.2009 15:57
NickLion писал(а): ↑
31.07.2009 23:29
Умные указатели не достаточно умные, чтобы побороть циклические ссылки.

У меня как-то возникло подозрение, что в Mono и .NET это никак не решено и объекты остаются в памяти до завершения выполнения программы. В C++ и других языках для этого есть тупые указатели (а так же умные, проверяющие, что память не освобождена).

В языках с "автоматическим" управлением памятью либо используются алгоритмы поиска циклических ссылок в машине сборки мусора (ява?) или могут дополнительно предоставляться "weak ptrs", в порядке исключения предоставляющие возможность ссылаться на объект не увеличивая его refcounter (предполагается, что забота программиста следить, чтоб порядок удаления объектов был правильным или беспокоиться, что ссылка может остаться зависшей) ((какой-то из) смоллтоков, библиотеки для С++).
В системах с отложенной сборкой мусора (ява и, полагаю, .Нет...) никто вам не гарантирует удаления объектов _сразу же_, поэтому они и правда могут оставаться в памяти до завершения выполнения программы - и даже не зависимо от того, циклические ссылки или нет - пока программе хватает памяти для размещения новых объектов. :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: указатели void*

Сообщение watashiwa_daredeska »

frp писал(а): ↑
01.08.2009 15:57
возникло подозрение, что в Mono и .NET это никак не решено и объекты остаются в памяти до завершения выполнения программы.
Решено. Не знаю точно, какой метод использовали в .NET и Mono, но можно посмотреть, в частности «mark and sweep» (есть и другие методы: отправная точка).
frp писал(а): ↑
01.08.2009 15:57
В C++ и других языках для этого есть тупые указатели (а так же умные, проверяющие, что память не освобождена).
Можно посмотреть в сторону Boehm's garbage collector for C and C++.
Спасибо сказали: