412 Часть HI. Современное программирование на С++
// Буквальное копирование приводит к тому , что два объекта
// с членами-указателями ссылаются на один блок памяти.
// При освобождении одного из них блок памяти также освобождается.
// Теперь второй объект ссылается на неопределенную область памяти.
// Взгляните на нижнюю картинку:
Рис. 17.1
Иллюстрация того, откуда берутся утечки памяти при буквальном копировании классов, содержащих указатели
Вернемся к классу INT_ARRAY из главы 16 "Перегрузка операций". В листингах 17.1 и 17.2 приведена реализация этого класса, дополненная буквальным конструктором копий. Несложно убедиться, что это приводит к ошибке, так как один из членов класса является указателем, ссылающимся на блок памяти, выделяемый операцией new.
1 // SMARRAY2.H — Определение класса интеллектуального массива
2 ttifndef _SMARRAY2_H
3 ftdefine _SMARRAY2_H
4 class INT_ARRAY
5 {
6 public:
7 INT_ARRAY( unsigned int sz = 100);
8 ~INT_ARRAY() ;
9 // Объявление конструктора копий
10 INT_ARRAY(const INT_ARRAY&) ;
11 // Объявление операции присваивания
12 INT_ARRAY& operator=(const INT_ARRAY&);
13 // Использование беззнаковых целых снимает необходимость
14 // проверки на отрицательные индексы
15 int& operator[]( unsigned int index);
16 private:
17 unsigned int max;
18 unsigned int dummy;
19 int *data;
20 );
21 #endif