Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpOpCpSh 40 of 150 menu
◀ ▶

Поверхностная копия в 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, если нет.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить