【问题标题】:C++11 Implementing a Move Contructor and Moving a Member VectorC++11 实现移动构造函数和移动成员向量
【发布时间】:2014-03-16 14:57:20
【问题描述】:

好的,我先放代码,然后问我的问题。

#include<vector>
#include<string>

using std::vector;
using std::string;

class MyStringContainer
{
public:
   MyStringContainer(vector<string> strVec): _strVec(strVec){;}
   MyStringContainer(MyStringContainer&& rhs): _strVec(move(rhs._strVec)){;}
private:
   vector<string> _strVec;
}

int main()
{
  vector<string> dummyVec(1000000, "arbitrary string");

  MyStringContainer strCon1(dummyVec);
  MyStringContainer strCon2(move(strCon1));
}

所以我刚刚花了一些时间学习移动语义,我想我已经了解了关于如何交换原始和/或智能指针并将丢弃的指针设置为 nullptr 的基本概念。但是,在处理向量(以及所有实现移动语义的容器)时,我不能 100% 确定我上面的代码是否会正确地“nullptr”源向量的指针元素。 std::vector 类的实现是否已经为我处理了这个问题?

【问题讨论】:

  • 什么指针元素?没有。但是你的代码很好。
  • @juanchopanza:我以为我在某处读到 std::vector 类确实包含一些指针(不确定,因为我是 stl/c++11 的新手),并且内存是为每个 push_back()/pop_back() 调用动态分配/解除分配,我认为它包含指针元素。
  • 您可以将这些指针视为实现细节。您不必担心它们。
  • @juanchopanza:嘿伙计,谢谢。真的很感激。 :) 只是想确保我没有遇到任何内存泄漏。我真的来自老派 c++。
  • 顺便说一句,您实际上不需要提供复制和移动复制构造函数。编译器生成的会做正确的事。

标签: c++ c++11 vector


【解决方案1】:

std::vector 的实现会为您处理这个问题。

【讨论】:

    【解决方案2】:

    std::vector 类将为您处理这个问题。事实上,在这种情况下,您可以使用隐式生成的移动构造函数。此外,如果您的构造函数按值获取vector&lt;string&gt;,这很好,您可能希望使用std::move 将其移动到成员变量中以保存副本:

    #include<vector>
    #include<string>
    
    class MyStringContainer {
    private:
       std::vector<std::string> strVec_;
    public:
       MyStringContainer(std::vector<std::string> strVec): strVec_(std::move(strVec)){ }
    };
    
    int main()
    {
      std::vector<std::string> dummyVec(1000000, "arbitrary string");
      MyStringContainer strCon1(std::move(dummyVec));
      MyStringContainer strCon2(std::move(strCon1));
    }
    

    注意我已经使用 std::move 将 dummyVec 移动到构造函数中以保存另一个副本。

    【讨论】:

    猜你喜欢
    • 2018-01-23
    • 2012-05-11
    • 2011-09-13
    • 2012-12-20
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多