Sto sviluppando un database noSQL e attualmente sto spostando il codice da C a C ++.
Ha classe Pair
, che contiene un puntatore raw a un blob di memoria.
class Pair {
Blob* blob;
...
};
Quindi se aggiungi questo Pair
alla classe List
, la classe List
memorizza internamente questo puntatore raw, senza copiare. Per non perdere memoria, List
notifica il Pair
non a delete
del puntatore raw.
class Pair {
Blob* _blob;
bool _owns_blob;
public:
Pair(Blob* blob, bool owns_blob = true)
: _blob(blob), _owns_blob(owns_blob) {}
~Pair() { if (_owns_blob) delete _blob; }
...
Blob* blob() { return _blob; }
void disown() { _owns_blob = false; }
};
void List::put(Pair& p) {
store_blob(p.blob());
p.disown();
}
A causa di questa notifica, non posso usare una firma del metodo come questa:
List.put(const Pair &p)
e dovrò passare per valore o per riferimento non const.
In seguito, se richiedi i dati, il programma crea un new Pair
e include il puntatore raw all'interno e indica anche Pair
a delete
del puntatore:
Pair List::get(...) {
return Pair(get_blob(), false);
}
Questo modello trarrebbe vantaggio da indicatori condivisi? In che modo ciò influisce sulla velocità e sul consumo di memoria?