Puntatori e memoria

Puntatori a funzione e callback

Un callback consente a un algoritmo di invocare logica scelta dal caller.

Che cos’è Puntatori a funzione e callback?

Un callback consente a un algoritmo di invocare logica scelta dal caller.

Passa un comportamento a un’altra funzione.

Punti importanti

  • Ogni puntatore deve riferirsi a un oggetto vivo compatibile o essere null.
  • Ogni allocation posseduta va liberata una sola volta.
  • Esprimi chiaramente ownership e const.

Esempi di codice C e C++

C
Esegui →
main.c
#include <stdio.h>

int square(int value) { return value * value; }
int apply(int value, int (*operation)(int)) { return operation(value); }

int main(void) {
    printf("%d\n", apply(6, square));
    return 0;
}
Output previsto
36
C++
Esegui →
main.cpp
#include <functional>
#include <iostream>

int apply(int value, const std::function<int(int)>& operation) {
    return operation(value);
}

int main() {
    int factor = 6;
    std::cout << apply(factor, [](int value) { return value * value; }) << '\n';
}
Output previsto
36

Confronto tra C e C++

C usa un tipo function pointer esplicito; C++ offre lambda e std::function con stato.

C

Ownership e cleanup sono convenzioni manuali.

C++

Container e RAII codificano ownership e cleanup nel lifetime.

Esercizi pratici

Esegui entrambe le versioni e modificale per osservare le diverse garanzie.

  • Testa null e fallimenti di allocation.
  • Usa AddressSanitizer e UndefinedBehaviorSanitizer.
  • Documenta ownership di ogni puntatore.