LINUX.ORG.RU

Ламерский вопрос про delete %(


0

0

Здравствуйте, уважаемые. Подскажите, пожалуйста, как корректно удалить уб`ект, когда указатель на него void* и известен его размер т.е.
class A
{
void *data;
int datasize;
.....
}
A::~A()
{
if(data) delete data;
...
}
компайлер на строке delete data пишет:
warning: `void *' is not a pointer-to-object type

как корректно удалить data? и еще - что возвращает sizeof() - int || unsigned

anonymous

Как data выделялся?

>и еще - что возвращает sizeof() - int || unsigned
printf("sizeof(int) = %d", sizeof(int));

Havoc ★★★★
()

Ему по всей видимости free нужно делать. Правильно говорит Havoc. Это зависит от способа выделения.

Banshee
()

> Подскажите, пожалуйста, как корректно удалить уб`ект, когда указатель на него
> void* и известен его размер
Havoc правильно заметил, ответ сильно зависит от того, как память выделялась.
Если память под data выделялась через new, то надо почитать на тему Run-time type
identification. Если есть хоть один виртуальный метод в объекте data, то его размер
сидит таблице виртуальных методов, и можно как-нибудь заставить delete
его воспринять, Вручную delete'у этот размер не вставишь.

Если же память выделялась malloc'ом, то просто free.

> что возвращает sizeof() - int || unsigned
По-моему, он size_t возвращает, а size_t обычно к unsigned int привязывается -
зависит от системы и библиотек (header'ов). Вообще, я не помню :), но gcc под
i386 мне выдал, что sizeof возвращает по крайней мере unsigned int:

#include <stdio.h>
int main (void)
{
printf(" %%d: sizeof(int[2147483647/3])=%d\n",sizeof(int[2147483647/3]) );
printf(" %%u: sizeof(int[2147483647/3])=%u\n",sizeof(int[2147483647/3]) );
return 0;
}
результат:
%d: sizeof(int[2147483647/3])=-1431655768
%u: sizeof(int[2147483647/3])=2863311528

Пояснения:
2^32/2-1=2147483647
2147483647/3*4 = 2.86331*10^9

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.