codice dalla libreria: segmento di codiceEliminazione oggetto chiamante in modo sicuro all'interno di una funzione di callback segmento
class Client{
public:
class CallBack {
public:
virtual void onData(Client* caller, std::string& data) =0;
};
Client(CallBack* callback):m_callBack(callback){}
virtual ~Client(){}
void onData(std::string data) {
m_callBack->onData(this, data);
m_totalDataVol += data.size();
}
private:
CallBack* m_callBack;
int m_totalDataVol = 0;
}
dall'applicazione:
class AppHandler: public Client::Callback {
void onData(Client* caller, std::string& data) {
/* Some complex logic and check certain conditions*/
delete caller; // Application will crash, due to
// accessing member of deleted object (m_totalDataVol)
}
}
Oltre oggetto chiamante (istanza della classe Client) è di proprietà di l'applicazione, e l'applicazione nessuna restrizione per eliminarlo.
Come si supera questo problema?
Molto complesso scenario: Client
classe della libreria di base può essere prorogato di un un'altra libreria (ClientEx
classe) e l'applicazione potrebbe utilizzare tale libreria estesa (non la libreria di base)
Lo sviluppatore di applicazioni dovrebbe esserne a conoscenza. Ma in questo caso non sono in grado di aggiungere allo sviluppatore dell'applicazione. Un'altra cosa è come applicare "non eliminare l'oggetto chiamante". E questo è solo un codice di esempio, ma nella realizzazione reale è necessario aggiungere una logica complessa nella funzione "onData" della classe Client. – Janaka
Siamo spiacenti, non capisco la prima parte del tuo commento. Riguardo al tuo secondo, questo si qualifica davvero come una domanda a parte. Suggerirei di rendere privato o protetto il distruttore. – davmac
Ci sarà un'implementazione ingombrante rendendo il distruttore privato o protetto. Quindi cerco un buon design, – Janaka