Вот пример:
class bad_design
{
public:
bad_design( std::size_t size )
: _buffer( new char[ size ] )
{}
~bad_design()
{
delete[] _buffer;
}
private:
char* _buffer;
};
Обратите внимание, что класс имеет конструктор и деструктор для обработки ресурса _buffer
.Также потребуется правильный конструктор копирования и оператор присваивания, но такой плохой дизайн, что он не был добавлен.Компилятор заполнит те реализацией по умолчанию, которая просто копирует указатель _buffer
.
При вызове функции:
void f( bad_design havoc ){ ... }
вызывается конструктор копирования bad_design
, которыйсоздаст новый объект, указывающий на тот же буфер, чем тот, который передан в качестве аргумента.Когда функция вернется, будет вызван деструктор локального копирования, который будет delete
ресурсами, указанными в переменной, используемой в качестве аргумента.Обратите внимание, что то же самое происходит при выполнении любой конструкции копирования:
bad_design first( 512 );
bad_design error( first );
bad_design error_as_well = first;