LINUX.ORG.RU

очистка памяти


0

0

Извините, если вопрос глупый, но можно узнать, как понять перед освобождением памяти, выделена ли память под удаляемую переменную или нет? Или пустая переменная (в данном случае, конечно, указатель) будет равна NULL?

anonymous

аффтар, не пишы больше. тебе пока рано программировать, тем более на языке, где надо ручками память чистить. не для тебя это, не по твоему уму задача.

anonymous
()

>Извините, если вопрос глупый, но можно узнать, как понять перед освобождением >памяти, выделена ли память под удаляемую переменную или нет? Конечно можно узнать

anonymous
()

> но можно узнать, как понять перед освобождением памяти, выделена ли
> память под удаляемую переменную
Можно наверное попробовать прыгнуть на p - sizeof(header) и посмотеть нет ли там чего-нибудь мусорообразного или находятся какие-то более осмысленные числа, только я не помню какой размер header'a и не уверен что он не system dependent.

dissident ★★
()
Ответ на: комментарий от dissident

PS Можно еще попробовать порыться в исходниках free() и malloc() и найти способ добраться до списка malloc'a.

dissident ★★
()

> Извините, если вопрос глупый, но можно узнать, как понять перед освобождением памяти, выделена ли память под удаляемую переменную или нет?

Нужный указатель обычно инициализируется ручками

Например

char * pItem = NULL; // инициализируем

...

pItem = (char *) malloc(...); // выделяем память

...

Что-то делаем

...

if (pItem) free(pItem); // отдаем память обратно

GameMagister
()

First of all, you shouldn't - usually - need this information. If you think you have leak, use memory profiler application, such as 'valgrind'

Having said that, if you do need this information, then:

Most general purpose memory allocation libraries (including malloc that comes with glibc, including windows CRT, including even vxworks libc) have APIs for testing a pointer to be allocated or not.

Refer to the relevant documentation. Do not attemt to decide according to contents of memory before - or after your pointer. Firstly, you can get false positives; secondly, some allocators I worked with use DIFFERENT schemes for different sizes, optimizing out the accounting information for small, fixed size blocks. You do not have - in general case - the nessesary information to deduce the algorithm that was used basing only on a pointer value. Memory allocation libraries do have that.

If your memory allocation library doesn't support this (which is unlikely), you can either use another, more convenient memory allocation library, write one yourself or decide you do not need it - after all.

Thanks

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