Esiste un modello di progettazione per evitare riferimenti ciondolanti?

2

Stavo pensando a un design per maniglie personalizzate. Il pensiero è di impedire ai clienti di copiare oggetti di grandi dimensioni. Ora una normale classe di handle probabilmente sarebbe sufficiente per questo, ma non risolve il "problema di riferimento ciondolante";

Se un client ha più handle dello stesso oggetto ed elimina l'oggetto tramite uno di essi, tutti gli altri non sarebbero validi, ma non lo sanno, quindi il client potrebbe scrivere o leggere parti della memoria che non dovrebbe avere accesso a

Esiste un modello di progettazione per impedire che ciò accada?

Due idee:

  1. Un pattern simile a un osservatore in cui il distruttore di un oggetto notifica tutti gli handle.

  2. "Gestisci maniglie" (esiste una cosa del genere?). Tutte le maniglie non puntano davvero all'oggetto, ma a un'altra maniglia. Quando l'oggetto viene distrutto, questo "master-handle" invalida se stesso e quindi tutto ciò che lo riguarda.

posta iFreilicht 05.06.2014 - 17:06
fonte

1 risposta

6

C ++ 11 ha introdotto due nuove classi di utilità: std::shared_ptr e std::unique_ptr . Se è necessario controllare una risorsa tramite più handle, quindi inserirla in un std::shared_ptr , che è un puntatore intelligente conteggiato con riferimento che pulisce la risorsa quando non ci sono più puntatori ad essa. std::unique_ptr è progettato per la proprietà singola, ma anche esso ripulirà automaticamente la risorsa che contiene quando l'handle stesso viene distrutto.

Mentre il nome _ptr sembra implicare puntatori , entrambe le classi possono essere personalizzate per funzionare con qualsiasi tipo di risorsa che deve essere restituita manualmente al sistema operativo. Ecco un esempio ipotetico che utilizza FILE* handle da C (perché lo utilizzi al posto degli stream dipende da te ...)

struct FILE_deleter {
    void operator() (FILE* fp) const {
        fclose(fp);
    }
};

void f()
{
    std::shared_ptr<FILE> sp(fopen("some-file.txt"), FILE_deleter{});

    // Now do whatever you want with sp: make copies of it, pass it around, whatever.
}
    
risposta data 05.06.2014 - 17:53
fonte

Leggi altre domande sui tag