Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Seal08, Вы писали:
S>>Копия создаётся именно в catch, например если написать S>>то никакой копии создаваться не будет и программа отработает нормально (только что проверил в gcc).
J>По стандарту, если я не ошибаюсь, копий объекта исключения может нагенериться сколько угодно независимо от способа ловли.
15.1/3
A throw-expression initializes a temporary object, called the exception object,
...
Как видишь, речь идет об одной копии. На количесво копий может повлиять как раз способ ловли — к примеру если catch ловит по значению...
Здравствуйте, Bell, Вы писали:
J>>По стандарту, если я не ошибаюсь, копий объекта исключения может нагенериться сколько угодно независимо от способа ловли. B>
B>15.1/3
B>A throw-expression initializes a temporary object, called the exception object,
B>...
B>Как видишь, речь идет об одной копии. На количесво копий может повлиять как раз способ ловли — к примеру если catch ловит по значению...
Может быть. Меня слово initializes смущает... В нем могут прятаться орды временных объектов...
Нету времени читать стандарт, да и неважно это.
Хотя, в принципе, если иметь гарантии, можно было бы в классе исключения держать std::auto_ptr на буфер со строкой ошибки — он будет корректно передавать владение и грохнет память в конце.
Но лично я бы завел просто статический буфер (в TLS, если много потоков) и писал бы все в него, а в классе исключения держал бы указатель на него, и все, никаких проблем с копированием и скоростью.
Здравствуйте, jazzer, Вы писали:
J>Но лично я бы завел просто статический буфер (в TLS, если много потоков) и писал бы все в него, а в классе исключения держал бы указатель на него, и все, никаких проблем с копированием и скоростью.
Хммм... А какого размера буфер? Особенно учитывая, что одновременно может быть несколько "активных" исключений...
J>У тебя есть возможность корректно завершить приложение (хотя бы путем корректного проброса исключения на самый верх), чтобы отработали все деструкторы, сохранились все файлы и т.д.
Маловероятно. Если уж у тебя память кончилась, то надеятся на то, что удастся посохранять файлы и позакрывать всякие ресурсы, не особо приходится.
Здравствуйте, Vamp, Вы писали:
J>>У тебя есть возможность корректно завершить приложение (хотя бы путем корректного проброса исключения на самый верх), чтобы отработали все деструкторы, сохранились все файлы и т.д.
V>Маловероятно. Если уж у тебя память кончилась, то надеятся на то, что удастся посохранять файлы и позакрывать всякие ресурсы, не особо приходится.
delete не аллокирует новую память, free() тоже, fclose() тоже, closesocket() тоже... вообще это хороший тон — делать функцию освобождения ресурса nofail...
ну если в лог не сможем чего записать — ну и фиг с ним.