簡體   English   中英

使用unique_ptr確保工廠中的唯一對象

[英]Guarantee Unique objects in factory using unique_ptr

我遇到了以下工廠代碼。

  • T::create(std::forward<Args>(args)...)返回指向動態創建的對象的指針。 因此,基本上,如果兩個對象具有相同的地址,則它們是相同的。
  • unique_ptr保證單個unique_ptr容器擁有持有的指針的所有權。 這意味着您無法復制unique_ptr。

#pragma once

#include <memory>
#include <vector>

template <typename T>
class PoolFactory {
 public:
  template <typename... Args>
  T *getInstance(Args... args) {
    _createdItems.push_back(
        std::unique_ptr<T>(T::create(std::forward<Args>(args)...)));
    return _createdItems.back().get();
  }
  ~PoolFactory() = default;

 public:
  std::vector<std::unique_ptr<T>> _createdItems;
};

假設我們試圖插入向量中已經存在的對象。 由於我們使用的是工廠, 如果對象已經存在,我們只想檢索它。 包含移動語義的體系結構將如何保證這種行為?

解釋此代碼,在該工廠中,您的對象由getInstance參數標識。 該接口還建議調用者同時知道T及其構造函數參數,以便他們可以自己構造T

該工廠的唯一用途是使每個對象成為單個對象。

您需要一個映射(args...) -> object ,而不是一個數組,因此首先您要使用args...查找現有對象args...並創建該對象(如果尚不存在)。

您已經反向獲得了std::unique_ptr<T>的“唯一性”。 沒有一種神奇的機制可以使您在創建std::unique_ptr<T>以某種方式檢查所有當前存在的std::unique_ptr<T> ,並且如果擁有相同的指針值,則會執行不同的操作。

相反,它假定您以前new編一個T *和構造std::unique_ptr<T>從中,或致電std::make_unique<T>new一個T ,並在包裝它unique_ptr<T>的您。 如果不是這種假設,並且std::unique_ptr<T>被銷毀,則程序的行為是不確定的。

這樣,禁止復制就可以確保您只delete 一次 delete ,並且通常不需要您付出額外的努力(即,指針的生命周期與指針的生命周期完全相同)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM