Я сделал две простые программы, в которых я пытаюсь переместить вещи из разных воспоминаний.
Один использует вектор, хранящийся в куче, другой - массив. После запуска примеров thoose, я не понимаю вывод.
Мне нравится видеть оператор перемещения как обмен между указателями, я могу ошибаться, но если ptr кучи получает указатель из стека, когда он очищается, куча ptr не укажет ничего ценного, если не будет сделана удаленная копия?
С вектором:
#include <iostream>
#include <utility>
#include <vector>
#include <array>
#include <string>
using namespace std;
struct Bitmap {
Bitmap() {}
Bitmap(string n) : name(n) {}
Bitmap(const Bitmap& other) {
name = other.name;
std::cout << "copy constructor" << std::endl;
}
Bitmap& operator=(const Bitmap& other) {
name = other.name;
std::cout << "assignment operator" << std::endl;
}
Bitmap(Bitmap&& other) {
name = move(other.name);
std::cout << "move constructor" << std::endl;
}
string name;
};
struct BitmapContainer {
BitmapContainer() {}
std::vector<Bitmap> data;
};
int main() {
BitmapContainer stackContainer;
BitmapContainer* heapContainer = new BitmapContainer();
Bitmap test;
Bitmap test2;
Bitmap* test3 = new Bitmap();
std::cout << "only on stack" << std::endl;
stackContainer.data.push_back(move(test));
std::cout << "stack to heap" << std::endl;
heapContainer->data.push_back(move(test2));
std::cout << "heap to heap" << std::endl;
heapContainer->data.push_back(move(*test3));
}
output:
only on stack
move constructor
stack to heap
move constructor
heap to heap
move constructor
copy constructor
2 first Перемещение подразумевает, что можно перемещать объект из одной памяти в другую, даже если мой вектор находится в куче, первый должен был потерпеть неудачу, как и второй. И я не понимаю, почему у меня в конце вызывается конструктор копирования.
Теперь, если вместо этого я использую массив:
struct BitmapContainer {
BitmapContainer() {}
std::array<Bitmap, 2> data;
};
int main() {
BitmapContainer stackContainer;
BitmapContainer* heapContainer = new BitmapContainer();
Bitmap test;
Bitmap test2;
Bitmap* test3 = new Bitmap();
std::cout << "only on stack" << std::endl;
stackContainer.data[0] = move(test);
std::cout << "stack to heap" << std::endl;
heapContainer->data[0] = move(test2);
std::cout << "heap to heap" << std::endl;
heapContainer->data[1] = move(*test3);
}
output:
only on stack
assignment operator
stack to heap
assignment operator
heap to heap
assignment operator
Только копии, я не знаю почему.