E 'questo il modo corretto di utilizzare puntatori std intelligenti per garantire la sicurezza ptrmodo corretto di utilizzare puntatori std intelligenti per garantire la sicurezza ptr
Questo esempio non può essere la migliore, ma sto cercando di emulare il codice vero e proprio. Il problema che avevo era nel codice reale, il puntatore del comunicatore era un puntatore non elaborato che poteva essere deselezionato in qualsiasi momento, causando un arresto anomalo nell'utilizzo del puntatore.
Così ho deciso di esaminare std :: shared_ptr e std :: weak_ptr per vedere come dovrebbe essere progettato ora abbiamo C++ 11. Io uso un weak_ptr nel codice di invio che controlla se il ptr è ancora valido e solo allora verrà dereferenziato il ptr. Questo codice è l'approccio corretto? Qualche miglioramento?
#include <memory>
#include <iostream>
#include <string>
class communicator
{
public:
communicator(const char* name, int comport, int speed) : name_(name), comport_(comport), speed_(speed) { }
void send(const std::string& s) {
std::cout << "sending " << s << " using " << name_ << " at " << speed_ << " rate and using com port " << comport_ << '\n';
}
private:
const char* name_;
int comport_;
int speed_;
};
class sender
{
public:
sender() {}
void set_communicator(std::weak_ptr<communicator> comms) {
comms_ = comms;
}
void send(const std::string& s)
{
if (auto sh = comms_.lock())
sh->send(s);
else
std::cout << "Attempting to send: " << s << " but ptr no longer exists\n";
}
private:
std::weak_ptr<communicator> comms_;
};
int main() {
sender mysender;
{
// create comms object
std::shared_ptr<communicator> comms(new communicator("myname", 3, 9600));
mysender.set_communicator(comms);
mysender.send("Hi guys!");
} // comms object gets deleted here
mysender.send("Hi guys after ptr delete!");
}
uscita:
sending Hi guys! using myname at 9600 rate and using com port 3
Attempting to send: Hi guys after ptr delete! but ptr no longer exists
Potrebbe essere più appropriato per codereview. – Jarod42
Vorrei usare 'std :: make_shared'. – Jarod42