Могу ли я проверить, был ли указатель выделен malloc/calloc/realloc?
Мне было интересно, можно ли проверить, был ли указатель, переданный в функцию, назначаться malloc/calloc/realloc?
int main(){
struct something o;
struct something *a;
a = malloc(sizeof(struct something));
freeSome(&o);/*This would normally throw an (corruption?) error*/
freeSome(a);/*This is fine*/
}
void freeSome(struct something * t){
if (/*expression here*/){
free(t);
}
}
Я понимаю, что обычно вы проверяете, есть ли t == NULL
, но мне просто интересно, можно ли увидеть, была ли выделена память для данного указателя.
Ответы
Ответ 1
Нет, вы не можете.
В принципе, вам не нужно это делать. Если вы хотите написать вспомогательную функцию, чтобы освободить некоторую память с помощью указателя, вы должны сознательно и явно передать динамически выделенный указатель на определенную область памяти, чтобы сделать это.
Необработанные указатели в C
не могут передавать дополнительную информацию о памяти, на которую они указывают. Если вы хотите получить такую информацию, вам придется передать дополнительную оболочку, содержащую интересующий вас указатель, например:
typedef struct my_pointer
{
void *ptr;
int is_dynamically_allocated;
} ptr;
Но это будет огромная потеря памяти/времени.
Ответ 2
Невозможно проверить, вы должны NULL
инициализировать, а затем проверить, действительно ли NULL
Из раздела 7.20.3.2 Свободная функция стандарта C99:
Свободная функция вызывает освобождение пространства, на которое указывает ptr, то есть, доступный для дальнейшего распределения. Если ptr нулевой указатель, никаких действий не происходит. В противном случае, если аргумент не сопоставить указатель, ранее возвращенный calloc, malloc или realloc функции, или если пространство было освобождено путем вызова бесплатного или realloc, поведение undefined.