class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
複製程式碼
-
C++11為我們提供了shared_ptr、unique_ptr和weak_ptr這三種智慧指標幫助我們更方便安全的使用動態記憶體。它們都定義在memory標頭檔案中。智慧指標的常見用法大家都應該很熟悉了,今天我想說一下智慧指標作為成員變數時的用法。比如上面這段程式碼,我想類Settings中的Device指標換成智慧指標,那麼getDevice應該是什麼樣的呢?
-
這裡主要的決定因素是你Device物件的所有權策略,即你想要誰去擁有它,決定它的生命期。如果只有Settings物件擁有它,當Settings析構的時候你希望Device也自動被析構。那麼你需要用unique_ptr,此時Settings獨自擁有Device物件的,因此Device的析構就只有Settings負責。在這種情況下,getDevice可以返回一個引用。
#include <memory>
class Device {
};
class Settings {
std::unique_ptr<Device> device;
public:
Settings(std::unique_ptr<Device> d) {
device = std::move(d);
}
Device& getDevice() {
return *device;
}
};
int main() {
std::unique_ptr<Device> device(new Device());
Settings settings(std::move(device));
// ...
Device& myDevice = settings.getDevice();
// do something with myDevice...
}
複製程式碼
- 如果你希望Device物件不只是Settings所獨有,那麼就需要使用shared_ptr了。這樣直到所有擁有Device的物件都析構了之後,Device才會析構。
#include <memory>
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> const& d) {
device = d;
}
std::shared_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device = std::make_shared<Device>();
Settings settings(device);
// ...
std::shared_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
複製程式碼