LINUX.ORG.RU

«C» Кто за мной подтёр ???


0

0

Всем привет.

Пишу значит програмку на С. Внутри создаю структуру типа list, выделяю память там, ссылочки друг на дружку у элементов кидаю. Решил короче проверить - правильно ли инициализация проходит - вывожу все элементы списка, смотрю их адреса и т.д.

Запустил несколько раз - получил - адреса не меняются. И тут до меня дошло, что уборку памяти-то я пока не сделал... как так выходит, что при выделении памяти адреса не меняются, ведь, по идее, та память так и должна была остаться занятой...?

anonymous

Ответ на: комментарий от parser

> От формата бинарника зависит.

Насколько я знаю, в ядре всего один механизм, который может использоваться прикладными программами для динамического

выделения памяти - сисколл sys_brk() (естественно, его и вызывает malloc()), который смещает break-адрес. Причём тут формат бинарника?

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

> Насколько я знаю, в ядре всего один механизм, который может использоваться прикладными программами для динамического выделения памяти - сисколл sys_brk()

еще mmap, анонимный mmap

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

> еще mmap, анонимный mmap

Согласен, упустил из виду. Но в данном случае автор темы использовал C, а там malloc() использует sys_brk().

Agent666
()

Всем спасибо за подробный ответ... мда есть пробелы в образовании :)

anonymous
()
Ответ на: комментарий от Agent666

> Согласен, упустил из виду. Но в данном случае автор темы использовал C, а там malloc() использует sys_brk().

Раньше использовал, сейчас большая часть реализаций использует анонимный маппинг

fmj
()
Ответ на: комментарий от Agent666

>Но в данном случае автор темы использовал C, а там malloc() использует sys_brk

чушь, то что использует malloc() зависит от libc, и реализация от сишного стандарта не зависит.

anonymous
()
Ответ на: комментарий от Agent666

Кстати, а кто-нибудь знает, 
1. Как в С узнать, сколько памяти выделено под указателем? Или нужно таскать за собой это значение как придаток к указателю после malloc(), чтобы знать размер этого "массива"?
2. man 3 free говорит о том, что возмрат mallocё`ом ненулевого указателя не гарантирует реального выделения памяти.. с этим как бороться?
3. Если я выделяю память под p : |a.......x........b| и начинаю двигать указатель по этой памяти. Когда p == x - беру и делаю free(p) - вся ли память будет освобождена, или только с x по b ?

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

1. Никак. Скорее всего, это заказанное тобой значение, дополненное до размера ближайшего большего числа, кратного степени 2

(но не меньше какого-то минимального значения)

2. Приведи этот отрывок из мана! Этого быть не может - возврат ненулевого указателя однозначно гарантирует выделение памяти; если

malloc() не может выделить блок памяти требуемого размера, то он возвращает NULL.

3. Указатель, передаваемый free(), должен указывать на начальный адрес выделенного блока памяти (в данном случае должно быть p = a).

В противном случае процесс получит сигнал SIGABRT. При передаче функции free() правильного указателя на блок памяти, весь

блок будет удалён, аллокатор памяти хранит информацию о размере блока.

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

Спасибо за ответ на 1 и 3. Вот выдержка из man 3 malloc из раздела BUGS:

________________________ MALLOC(3) Linux Programmer's Manual MALLOC(3)

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer. In case Linux is employed under circumstances where it would be less desirable to suddenly lose some randomly picked processes, and moreover the kernel version is suf- ficiently recent, one can switch off this overcommitting behavior using a command like # echo 2 > /proc/sys/vm/overcommit_memory

GNU 1993-04-04 MALLOC(3) ________________________

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

Меня этот bug заинтересовал в связи с тем, что в одной моей проге происходит segfault по неизвестной мне причине... но иногда вместо сегфалта на консоль вылазит загадочное сообщение "Killed" :-/

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

Если эта информация приведена в разделе BUGS, то, похоже, единственный способ побороться с этим - написать патч.

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

Ну так вроде маны 93-м годом датируются... мож чего изменилось с тех пор... как это можно выяснить?

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