The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"deleting `void*' is undefined"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"deleting `void*' is undefined"  +/
Сообщение от pavlinux (ok) on 03-Дек-10, 03:41 

Tclist::~Tclist() {
    int i;

    for (  i =  0; i < aLimit; i++ ) {
        void *item = At(i);
        if (item != NULL)  {
            delete item; // Тут ругается: deleting `void*' is undefined
        }
    }
    delete items;
}


Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "deleting `void*' is undefined"  +/
Сообщение от ImPressed (ok) on 03-Дек-10, 07:04 
>[оверквотинг удален]
>         void *item = At(i);
>         if (item != NULL)
>  {
>            
> delete item; // Тут ругается: deleting `void*' is undefined
>         }
>     }
>     delete items;
> }
>

Переменную какого типа возвращает функция At()?
Приведите item к тому типу, который возвращает At().

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "deleting `void*' is undefined"  +/
Сообщение от Вова on 03-Дек-10, 10:03 
>[оверквотинг удален]
>>  {
>>            
>> delete item; // Тут ругается: deleting `void*' is undefined
>>         }
>>     }
>>     delete items;
>> }
>>
> Переменную какого типа возвращает функция At()?
> Приведите item к тому типу, который возвращает At().

+проверка на нуль для delete бессмысленна

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "deleting `void*' is undefined"  +/
Сообщение от pavlinux (ok) on 03-Дек-10, 15:42 
>[оверквотинг удален]
>>         if (item != NULL)
>>  {
>>            
>> delete item; // Тут ругается: deleting `void*' is undefined
>>         }
>>     }
>>     delete items;
>> }
>>
> Переменную какого типа возвращает функция At()?

void*


class Tclist {
  public:
    Tclist(int _Limit);
    ~Tclist();
    inline void *At(int _Index) {
            return (_Index >= aLimit ? NULL:items[_Index]);
        };  
...

> Приведите item к тому типу, который возвращает At().

Нашёл совет - делать free()


Tclist::~Tclist() {
    int i;

    for (  i =  0; i < aLimit; i++ ) {
        void *item = At(i);
        if (item != NULL)  {
            free(item);
        }
    }
    delete items;
}

Смущает другое,... вот такой вариант аналогичен?!  

Tclist::~Tclist() {
    
    for ( int i =  0; i < aLimit; i++ ) {
        if ( NULL != At(i) )  
               delete At(i);
    }
delete items;
}


Код не мой, и этот факинг C++, хрен поймешь () - это присваивание или аргумент функции.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "deleting `void*' is undefined"  +/
Сообщение от NuINu (??) on 04-Дек-10, 19:22 

> Нашёл совет - делать free()
>            
> free(item);
>    delete At(i);
> Код не мой, и этот факинг C++, хрен поймешь () - это
> присваивание или аргумент функции.

Совет не правильный, free чисто помечает выделенный участок памяти как свободный, в то время как delete вызывает деструктор(и если это правильный деструктор то он будет виртуальным), который помимо вызова фри выполняет особождение еще сопутствующих ресурсов данного обьекта, как например связанные области памяти, установленные семафоры и тп ресурсы. если вызывать фрии то у вас как минимум при использованнии данного класса начнуться утечки памяти.
В простейшем случае когда обьект занимает только ресурс данный ресурс памяти и не имеет ранее выделеных связанных областей, конечно этого не произойдет. но кто знает как затем будет использваться ваш класс? вполне вероятно что вы решите там хранить очень сложные обьекты.

поэтому настоятельно рекомендуется вызывать делете.

так вот, вызывая void *item = At(i); и затем делете, вы пытаетесь вызвать виртуальный или а скорее статический деструктор для типа void *, что является неправильным с точки зрения компилятора, скорее всего делит не может определить что вызвать.

а поскольку вы не знаете что за типы будут храниться в вашем списке единственным вариантом будет delete At(i) (хотя можно поставить присваивание некому базовому классу и уничтожать его элемент)  тогда компилятор оставит выбор вызова деструктора до этапа выполнения.

Кстати, надеюсь что вы деструктор своего класса сделали виртуальным? ))))

почитайте Ален Голуб с энд С++ правила программирования, с++ это далеко не си

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "deleting `void*' is undefined"  +/
Сообщение от anonymous (??) on 29-Янв-11, 19:14 
openpref? хихикс. выкинуть и переписать. или использовать стльный контейнер.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру