$stmt->free_result() libera memória relacionada a um conjunto de resultados, enquanto $stmt->close() libera memória relacionada a uma instrução preparada. Subseqüentemente chamando $stmt->close() cancelará qualquer resultado ainda restante. Em essência, chamar
$stmt->close() fornecerá o mesmo efeito que chamar $stmt->free_result() uma vez que cancela o conjunto de resultados também. Mas chamar $stmt->free_result() não irá limpar a memória usada pela instrução preparada, caso em que você deve usar $stmt->close() . No que diz respeito a qual usar - pode haver situações em que você pretenda usar a instrução preparada que inicializou, mas não precisa mais do conjunto de resultados que possui atualmente. Nesse caso, você esperaria chamando
$stmt->close() até que você termine com a instrução preparada e, em vez disso, chame $stmt->free_result() antes de executar outra instrução.