這個問題不能用你提供的代碼來回答。真正的問題是爲什麼你可以接受一個指針或者沒有,並且如果一個指針傳給你,誰擁有內存。
根據你的對象應該在你的特定領域做什麼,然後有不同的選擇可以採取。例如,如果您可以與主叫方共享所有權,那麼您應該採取shared_ptr
,如果您要保留對象中的所有權,則應使用unique_ptr
在界面中明確指出您的對象將獲取所有權。如果所有權不被共享,則考慮通過一個參考對象(即使在內部你存儲一個指針),在這種情況下,你可以實際使用單獨的所有權:
從什麼大家
// option 1: shared ownwership
class A {
std::shared_ptr<B> ptr;
public:
A(std::shared_ptr<B> const & p) : ptr(p) {}
A() : ptr(std::make_shared<B>()) {}
};
// option 2: grab ownership
class A {
std::unique_ptr<B> ptr;
public:
A(std::unique_ptr<B> p) : ptr(std::move(p)) {}
A() : ptr(new B(); }
};
// option 3: no ownership (unless we create the object)
// (separating concerns: ref to access the object, ptr to manage it)
class A {
std::unique_ptr<B> ptr; // only ownership
B * ref;
public:
A(B & b) : ptr(), ref(&b) {}
A() : ptr(new B()), ref(ptr.get()) {}
// Internally use 'ref' to access the object the destructor will delete it
// if needed
};
沒有優雅的解決方案。你只需要記錄誰擁有指點物。如果'A'擁有它,那麼永遠不會傳遞一個指向自動分配的'B'的指針,但是由調用者來確定。 – juanchopanza
歡迎來到爲什麼你永遠不應該使用原始指針的原因! –
+1 @juanchopanza - 我不明白爲什麼有人想要/需要傳入並存儲一個指向任何可能具有比構造的對象更少的生命週期的指針,並且也可能被對象驅動器破壞。任何人都可以提出爲什麼可以這樣做嗎?當然,無論這個物體是否擁有它,或者沒有。 –