Правила программирования на С и С++. Главы 7-8 Страница 38. Не возвращайте ссылки на память, выделенную оператором 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, то быть по сему. |