Как определить, где был выделен блок памяти?

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

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

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

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

person Squall    schedule 07.05.2011    source источник
comment
Я не думаю, что ты можешь, зачем тебе это?   -  person MByD    schedule 08.05.2011
comment
Я хочу избежать утечек памяти. У меня есть указатель в функции, и указатель больше не будет использоваться, но я не знаю, указывает ли он на кучу. Если он указывает на кучу, его можно освободить.   -  person Squall    schedule 08.05.2011
comment
Конечно, вы знаете, это был ваш код, который выделил его. Нет никакой причины, по которой это знание вдруг становится недоступным. Помимо серьезно ошибочного дизайна программы. Доверие оракулу в предоставлении недостающих знаний также является серьезным недостатком. Хуже того, он портируется как cr*p.   -  person Hans Passant    schedule 08.05.2011
comment
Я согласен, что это почти наверняка плохая дизайнерская идея, но, тем не менее, полезно знать, в каком разделе памяти находится указатель. Это легко сделать во встроенной системе, поскольку он просто соответствует границам раздела. Однако с ОС вам нужно как-то спросить ОС.   -  person djs    schedule 08.05.2011
comment
Если я храню указатель в объекте, при удалении объекта мне придется удалить указатель в деструкторе, но указатель должен указывать на кучу.   -  person Squall    schedule 08.05.2011


Ответы (1)


Вы не можете.

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

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

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

person MByD    schedule 07.05.2011