Ниже приведена ошибочная реализация «правила трех», которую я пытаюсь понять.
При отладке программы я обнаружил, что у отладчика есть проблема очистки int *k
, которая может быть решеналибо определив int *k = nullptr
, либо просто установив для него что-то разумное в конструкторе копирования.
Однако я не понимаю, как возникшая ошибка программы, нарушение прав доступа, возникает.
Я знаю, что после конструктора назначения копирования v1
s int *k
больше не указывает на действительный адрес памяти.
class Vector2 {
public:
std::string name = "default";
int* k;
Vector2(int s, std::string n) : k(new int[s]), name(n) {
}
Vector2(const Vector2 &other) {
std::cout<< "Copy constructor: " << name << std::endl;
}
~Vector2() {
std::cout << "Deleting: " << name << std::endl;
delete[] k;
}
void swap(Vector2& other) {
using std::swap;
swap(k, other.k);
}
Vector2& operator=(Vector2 other) {
std::cout << "Copy assignment constructor: " << name << std::endl;
swap(other);
return *this;
}
};
int main() {
Vector2 v1 = Vector2(2, "v1");
Vector2 v2 = Vector2(4, "v2");
v1 = v2;
std::cout << &v1 << " " << &v2 << std::endl;
std::cout << &v1.k << " " << &v2.k << std::endl;
return 0;
}
Ниже приведен вывод консоли вышеуказанной программы:
Copy constructor: default
Copy assignment constructor: v1
Deleting: default
0000001B5611FA28 0000001B5611FA78
0000001B5611FA50 0000001B5611FAA0
Deleting: v2
Deleting: v1
16:18:42: The program has unexpectedly finished.