每次如何实现移动构造函数以避免深层复制?

时间:2019-03-25 00:57:32

标签: c++ c++14 move deep-copy

我正在练习每次通过传递R-Value来执行move构造函数。但是有时会调用Deep Deep构造函数,而不应该这样做。

我正在将R值对象插入向量中。这段代码的逻辑缺陷是什么?

我已经尝试调试,但是我不明白为什么在对象移动后调用了深拷贝构造函数?

#include <iostream>
#include <string>
#include <vector>
using namespace std;
class example{
    private:
     int *pointer;
public:
    //constructor
    example(int d){
        pointer = new int;
        *pointer = d;
        cout<<"Constructor Called"<<endl;
    }


// deep copy
    example(const example &source){
        pointer = new int;
        *pointer= *source.pointer;
        cout<<"deep copy made"<<endl;
    }
// Move Constructor
    example(example &&source):pointer{source.pointer}{
    source.pointer = nullptr;
    cout << "object moved"<<endl;
    }
    ~example() {
        delete pointer;
        cout << "Destroyed"<<endl;
    }

};

int main()
{

    vector <example> vec;
    vec.push_back(example{300});
    vec.push_back(example{300});
    vec.push_back(example{300});
    vec.push_back(example{300});
    return 0;
}

如果代码正确,它将始终使用MOVE构造函数,并且将避免深层复制

1 个答案:

答案 0 :(得分:2)

通过添加NOEXCEPT解决了该问题

 example(example &&source) noexcept :pointer{source.pointer}  {
        source.pointer = nullptr;
        cout << "object moved"<<endl;
        }