繁体   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