C ++如何将对象移至nullptr

Kem*_*hou 1 c++ pointers move c++11

我在想一个奇怪的用例,我想将对象移到nullptr。也许我应该给出一个代码片段:

class Objpair {
   public:
      Objpair(Obj&& a, Obj&&b) : first(&a), second(&b) { }
   private:
       Obj* first;
       Obj* second;
};
Run Code Online (Sandbox Code Playgroud)

问题在于,当a和b超出范围时,第一和第二指针将悬空。如果我可以将Object a移到第一个指针上,那么应该就不会出现双重释放和作用域问题。如果首先将成员声明为Obj而不是Obj *指针,则直接的first(std :: move(a))将完成此工作。我在这里一定做错了。我正在考虑移动而不是复制,因为我试图将控制权从另一个对象转移到当前对象并提高性能。

使用指针版本是因为我正在考虑成员对象的多态行为。

Gal*_*lik 5

您可以做的是像这样从参数中移动构造对象:

class Objpair {
   public:
      Objpair(Obj&& a, Obj&& b)
      : first(new Obj(std::move(a)))
      , second(new Obj(std::move(b)))
      {}

   private:
       Obj* first;
       Obj* second;
};
Run Code Online (Sandbox Code Playgroud)

我建议您使用std::unique_ptr

class Objpair {
   public:
      Objpair(Obj&& a, Obj&& b)
      : first(std::make_unique<Obj>(std::move(a)))
      , second(std::make_unique<Obj>(std::move(b)))
      {}

   private:
       std::unique_ptr<Obj> first;
       std::unique_ptr<Obj> second;
};
Run Code Online (Sandbox Code Playgroud)