class X { Y* elements; unsigned elementsCount; void free() { delete[] elements; } void copyFrom(const X& other) { elementsCount = other.elementsCount; elements = new Y[elementsCount]; for (unsigned i = 0; i < elementsCount; ++i) elements[i] = other.elements[i]; } public: X() { elements = nullptr; elementsCount = 0; } ~X() { free(); } X(const X& other) { copyFrom(other); } X& operator=(const X& other) { if (this != &other) { free(); copyFrom(other); } return *this; } X(X&& other) { elements = other.elements; elementsCount = other.elementsCount; other.elements = nullptr; other.elementsCount = 0; } X& operator=(X&& other) { if (this != &other) { free(); elements = other.elements; elementsCount = other.elementsCount; other.elements = nullptr; other.elementsCount = 0; } return *this; } };