Функция освобождения экземпляра struct Foo приведена ниже:
void DestroyFoo(Foo* foo)
{
if (foo) free(foo);
}
Мой коллега предложил вместо этого следующее:
void DestroyFoo(Foo** foo)
{
if (!(*foo)) return;
Foo *tmpFoo = *foo;
*foo = NULL; // prevents future concurrency problems
memset(tmpFoo, 0, sizeof(Foo)); // problems show up immediately if referred to free memory
free(tmpFoo);
}
Я вижу, что установка указателя на NULL после освобождения лучше, но я не уверен в следующем:
- Нам действительно нужно назначить указатель на временный? Помогает ли это с точки зрения concurrency и разделяемой памяти?
- Действительно ли это хорошая идея, чтобы весь блок был равен 0, чтобы заставить программу сбой или, по крайней мере, выводить результаты со значительным расхождением?
Спасибо заранее!