Поверхностная копия в C++
Оператор new[] выделяет массив и возвращает
адрес первого элемента. delete[] этот массив
освобождает. Если поле хранит такой адрес, копия
по умолчанию переносит только адрес, а не элементы.
Оба объекта смотрят на один массив - это
поверхностная копия.
Деструктор каждого объекта вызывает delete[]
для своего поля. После копии адрес один, и второй
вызов освобождает уже освобожденный массив.
Такой буфер освобождают один раз.
Запишем класс с указателем на массив из одного целого:
class User {
public:
int* data;
User() {
data = new int[1];
data[0] = 10;
}
~User() {
delete[] data;
}
};
Сейчас создадим объект и его копию.
Перед концом main обнулим указатель у копии,
чтобы деструктор не освободил память второй раз -
в учебном примере буфер снимает только исходный объект:
int main() {
User user1;
User user2 = user1;
std::cout << (user1.data == user2.data) << "\n";
user2.data = nullptr;
return 0;
}
Сделайте класс Buffer с полем int*
на буфер из new[], скопируйте объект
и выведите 1, если адреса в полях
совпали, и 0, если нет.