Рассмотрим следующий код:
class A
{
B* b; // an A object owns a B object
A() : b(NULL) { } // we don't know what b will be when constructing A
void calledVeryOften(…)
{
if (b)
delete b;
b = new B(param1, param2, param3, param4);
}
};
Моя цель: мне нужно максимизировать производительность, которая в этом случае означает минимизацию объема выделения памяти.
Очевидная вещь здесь - изменить B* b; на B b;. Я вижу две проблемы с этим подходом:
- Мне нужно инициализировать
bв конструкторе. Поскольку я не знаю, что будетb, это означает, что мне нужно передать фиктивные значения в конструктор B. Который, ИМО, уродлив. - В
calledVeryOften()мне нужно будет сделать что-то вроде этого:b = B(…), что неверно по двум причинам:- Деструктор
bне будет вызываться. - Будет создан временный экземпляр B, а затем скопирован в
b, тогда будет вызван деструктор временного экземпляра. Копирование и вызов деструктора можно было бы избежать. Хуже того, вызов деструктора вполне может привести к нежелательному поведению.
- Деструктор
Итак, какие решения мне нужно избегать, используя new? Имейте в виду, что:
- У меня есть только контроль над A. У меня нет контроля над B, и у меня нет контроля над пользователями A.
- Я хочу, чтобы код был чистым и удобным для чтения.