412 Часть HI. Современное программирование на С++

h04121.jpg

// Буквальное копирование приводит к тому , что два объекта

// с членами-указателями ссылаются на один блок памяти.

// При освобождении одного из них блок памяти также освобождается.

// Теперь второй объект ссылается на неопределенную область памяти.

// Взгляните на нижнюю картинку:

h04122.jpg

Рис. 17.1

Иллюстрация того, откуда берутся утечки памяти при буквальном копировании классов, содержащих указатели

Вернемся к классу INT_ARRAY из главы 16 "Перегрузка операций". В листингах 17.1 и 17.2 приведена реализация этого класса, дополненная буквальным конструктором копий. Несложно убедиться, что это приводит к ошибке, так как один из членов класса является указателем, ссылающимся на блок памяти, выделяемый операцией new.

h04123.jpg

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