C++智能指針做爲成員變量

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...
}
相關文章
相關標籤/搜索