throw в конструкторе?
От: slava_phirsov Россия  
Дата: 29.12.09 08:16
Оценка:
Доброго всем времени суток, читая уважаемого С.Майерса возник вот такой вопрос.

Во второй части эпохального труда "Effective C++", в правиле 26 дается пример класса с ограничением числа экземпляров, которое обеспечивается за счет генерации исключений в конструкторе, примерно вот так:

Foo::Foo()
{
    if (_num_instances >= NUM_INSTANCES_MAX)
        throw TooManyInstances();
}


Предполагается, что в случае, если будет сделана попытка создать слишком много экземпляров класса, возникшее исключение не позволит довести процесс до конца. Если исключение не будет перехвачено, то приложение просто вылетит, если будет перехвачено, но экземпляр Foo будет создаваться в стеке — за счет выравнивания стека выделенная для экземпляра память будет возвращена системе. Однако что будет в случае, когда экземпляр создается в куче, а исключение перехватывается? Перед вызовом конструктора будет вызван new и выделена память, в конструкторе будет сгенерировано исключение, вызывающий код его перехватит, а выделенная память — так и останется висеть, и приложение в принципе не может получить указатель на эту память и уж тем более освободить ее. Так? Или стандарт как-то эту ситуацию оговаривает особо? Или я чего-то недопонимаю?

Заранее благодарю за разъяснения.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.