C++智慧指標作為成員變數

吳尼瑪發表於2017-12-19
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...
}
複製程式碼

相關文章