Правила программирования на С и С++. Главы 7-8 - Не возвращайте ссылки на память, выделенную оператором new

ОГЛАВЛЕНИЕ

 

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, то быть по сему.