Как определить, где был выделен блок памяти? - PullRequest
1 голос
/ 08 мая 2011

Блок памяти может быть выделен статически, в стеке или в куче. Я хочу знать способ определения, если указатель указывает на кучу. Я работаю с Windows и Linux, и это не проблема отдельного решения для каждой ОС. Я использую GCC и Mingw.

Если бы я мог знать, где начинается куча и где она заканчивается, я думаю, что проблема может быть решена. Я думаю, что могу определить дно и вершину стека, чтобы узнать, находится ли блок в стеке, но если есть несколько потоков, то есть несколько стеков. Даже если бы я мог знать, где находится статическая память, я думаю, что у меня будут проблемы со статическими блоками памяти общих библиотек.

Думаю, у меня возникнет проблема, если указатель не будет указывать на начало блока:

type* x =  &(pointer[3]);

1 Ответ

3 голосов
/ 08 мая 2011

Вы не можете.

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

Альтернативный способ - добавить модуль управления памятью в вашу программу, который обернетФункции malloc, free и т. Д. Будут отслеживать всю выделенную память и будут вызывать free, только если указатель появится в его списке.Хотя это может показаться большой работой, чтобы избежать утечек памяти, я нашел это очень удобным много раз.

РЕДАКТИРОВАТЬ Как уже упоминалось в комментариях, лучший способ решить прост - освободить его в месте, где вы знаете, находится он в куче или нет.Я не могу сказать, насколько это легко в вашем случае, но обычно это не должно быть слишком сложно, многие программы / программисты делали это раньше, и я сомневаюсь, что кто-то на самом деле пытался проверить, где была выделена память.

...