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

问题描述 投票:0回答:1

这个问题在这里已有答案:

我正在练习每次通过传递R值来执行移动构造函数。但有时深度拷贝构造函数被调用它不被支持。

我在向量中插入一个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构造函数,它将避免深度复制

c++ c++14 move deep-copy
1个回答
2
投票

解决了它添加NOEXCEPT解决了这个问题

 example(example &&source) noexcept :pointer{source.pointer}  {
        source.pointer = nullptr;
        cout << "object moved"<<endl;
        }
© www.soinside.com 2019 - 2024. All rights reserved.