尽管我提供了移动构造函数,但仍调用了复制构造函数
Copy constructor is called although I have provided the move constructor
我已经实现了复制构造函数和移动构造函数,我了解到程序必须使用移动构造函数而不是复制构造函数。
class Move
{
private:
int *data; // raw pointer
public:
Move(int); // constructor
Move(const Move &source); // copy constructor
Move(Move &&source); // Move Constructor
~Move();
};
Move::Move(int d)
{
data = new int;
*data = d;
cout << "Constructor for: " << d << endl;
}
Move::Move(const Move &source)
: Move(*source.data)
{
cout << "Copy constructor -deep copy for: " << *data << endl;
}
Move::Move(Move &&source)
: data{source.data}
{
source.data = nullptr;
cout << "Move constructor -Moving resource: " << *data << endl;
}
Move::~Move()
{
if (data != nullptr)
{
cout << "Destructor freeing data for : " << *data << endl;
}
else
{
cout << "Destructor freeing data for nullptr" << endl;
}
delete data;
}
//driving function
int main()
{
vector<Move> vec;
vec.push_back(Move{10});
vec.push_back(Move{20});
vec.push_back(Move{30});
vec.push_back(Move{40});
vec.push_back(Move{50});
vec.push_back(Move{60});
vec.push_back(Move{70});
return 0;
}
输出:
构造函数:10
移动构造函数-移动资源:10
析构函数为 nullptr 释放数据
构造函数:20
移动构造函数-移动资源:20
构造函数:10
复制构造函数-深度复制:10
析构函数释放数据:10
析构函数为 nullptr 释放数据
构造函数:30
移动构造函数-移动资源:30
构造函数:10
复制构造函数-深度复制:10
构造函数:20
复制构造函数-深度复制:20
析构函数释放数据:10
析构函数释放数据:20
析构函数为 nullptr 释放数据
构造函数:40
移动构造函数-移动资源:40
析构函数为 nullptr 释放数据
构造函数:50
移动构造函数-移动资源:50
构造函数:10
复制构造函数-深度复制:10
构造函数:20
复制构造函数-深度复制:20
构造函数:30
复制构造函数-深度复制:30
构造函数:40
复制构造函数-深度复制:40
析构函数释放数据:10
析构函数释放数据:20
析构函数释放数据:30
析构函数释放数据:40
析构函数为 nullptr 释放数据
构造函数:60
移动构造函数-移动资源:60
析构函数为 nullptr 释放数据
构造函数:70
移动构造函数-移动资源:70
析构函数为 nullptr 释放数据
析构函数释放数据:10
析构函数释放数据:20
析构函数释放数据:30
析构函数释放数据:40
析构函数释放数据:50
析构函数释放数据:60
释放数据的析构函数:70
因为 std::vector 仅当您有 noexcept 移动构造函数时才在调整大小时移动。
或者您可以调用 vec.reserve(7)
以避免调整大小。
我已经实现了复制构造函数和移动构造函数,我了解到程序必须使用移动构造函数而不是复制构造函数。
class Move
{
private:
int *data; // raw pointer
public:
Move(int); // constructor
Move(const Move &source); // copy constructor
Move(Move &&source); // Move Constructor
~Move();
};
Move::Move(int d)
{
data = new int;
*data = d;
cout << "Constructor for: " << d << endl;
}
Move::Move(const Move &source)
: Move(*source.data)
{
cout << "Copy constructor -deep copy for: " << *data << endl;
}
Move::Move(Move &&source)
: data{source.data}
{
source.data = nullptr;
cout << "Move constructor -Moving resource: " << *data << endl;
}
Move::~Move()
{
if (data != nullptr)
{
cout << "Destructor freeing data for : " << *data << endl;
}
else
{
cout << "Destructor freeing data for nullptr" << endl;
}
delete data;
}
//driving function
int main()
{
vector<Move> vec;
vec.push_back(Move{10});
vec.push_back(Move{20});
vec.push_back(Move{30});
vec.push_back(Move{40});
vec.push_back(Move{50});
vec.push_back(Move{60});
vec.push_back(Move{70});
return 0;
}
输出:
构造函数:10
移动构造函数-移动资源:10
析构函数为 nullptr 释放数据
构造函数:20
移动构造函数-移动资源:20
构造函数:10
复制构造函数-深度复制:10
析构函数释放数据:10
析构函数为 nullptr 释放数据
构造函数:30
移动构造函数-移动资源:30
构造函数:10
复制构造函数-深度复制:10
构造函数:20
复制构造函数-深度复制:20
析构函数释放数据:10
析构函数释放数据:20
析构函数为 nullptr 释放数据
构造函数:40
移动构造函数-移动资源:40
析构函数为 nullptr 释放数据
构造函数:50
移动构造函数-移动资源:50
构造函数:10
复制构造函数-深度复制:10
构造函数:20
复制构造函数-深度复制:20
构造函数:30
复制构造函数-深度复制:30
构造函数:40
复制构造函数-深度复制:40
析构函数释放数据:10
析构函数释放数据:20
析构函数释放数据:30
析构函数释放数据:40
析构函数为 nullptr 释放数据
构造函数:60
移动构造函数-移动资源:60
析构函数为 nullptr 释放数据
构造函数:70
移动构造函数-移动资源:70
析构函数为 nullptr 释放数据
析构函数释放数据:10
析构函数释放数据:20
析构函数释放数据:30
析构函数释放数据:40
析构函数释放数据:50
析构函数释放数据:60
释放数据的析构函数:70
因为 std::vector 仅当您有 noexcept 移动构造函数时才在调整大小时移动。
或者您可以调用 vec.reserve(7)
以避免调整大小。