vector::push_back操作,保证了如果过程中出现异常,vector不会发生变化。

push_back过程中,可能会因为已有内存空间不够,申请新的内存,同时把原内存中已有的元素,放到新申请的内存中。

这时候,如果移动构造不保证没有异常,就会发生一件事:

为了保证前述性质,不得不调用copy constructor.

 

代码可以看到不同。

class A{
public:
        A(const A& rhs){
                printf("copy construct\n");
                if(rhs.data)
                {
                        data = new string(*rhs.data);
                }
                else
                {
                        data = NULL;
                }
        }
        A():data(NULL){printf("default construct\n");}

        A(A&& rhs) /*noexcept*/:data(rhs.data)
        {
                printf("move construct\n");
                rhs.data = NULL;
        }
     ~A(){printf("deconstruct\n");delete data;}
private:
        string *data;
};

int main()
{
  vector<A> v;
  v.resize(5);
  A a;
  v.push_back(std::move(a));
  return 0;
}

可以很明显看出差别

 

posted on 2019-04-23 16:04  newbird2017  阅读(303)  评论(0编辑  收藏  举报