Правила программирования на С и С++. Главы 7-8 - Не возвращайте ссылки на память, выделенную оператором new
ОГЛАВЛЕНИЕ
Страница 38 из 74
123. Не возвращайте ссылки на память, выделенную оператором new.
Каждый вызов new должен сопровождаться delete - подобно malloc() и free(). Я иногда видел людей, старающихся избежать накладных расходов от конструкторам копии перегруженной бинарной операции подобным образом:
const some_class ?some_class::operator+( const some_class ?r ) const{
some_class *p = new some_class;// ...
return *p;
}Этот код не работает, потому что вы не можете вернуться к этой памяти, чтобы освободить ее. Когда вы пишите: some_class a, b, c;c = a + b;
то a + b возвращает объект, а не указатель. Единственным способом получить указатель, который вы можете передать в оператор delete, является: some_class *p;c = *(p = ?(a + b));
Это даже страшно выговорить. Функция operator+() не может прямо возвратить указатель. Если она выглядит подобным образом: const some_class *some_class::operator+( const some_class ?r ) const{
some_class *p = new some_class;// ...
return p;
}то вы должны записать: c = *(p = a + b);что не так страшно, как в предыдущем примере, но все еще довольно плохо. Единственное решение этой задачи состоит в том, чтобы стиснуть зубы и вернуть объект: const some_class *some_class::operator+( const some_class ?r ) const{
some_class obj;// ...
return obj;
}Если вам удастся вызвать конструктор копии в операторе return, то быть по сему.