Re[6]: throw, wchar_t* и память
От: Bell Россия  
Дата: 15.04.08 09:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Seal08, Вы писали:


S>>Копия создаётся именно в catch, например если написать

S>>то никакой копии создаваться не будет и программа отработает нормально (только что проверил в gcc).

J>По стандарту, если я не ошибаюсь, копий объекта исключения может нагенериться сколько угодно независимо от способа ловли.

15.1/3
A throw-expression initializes a temporary object, called the exception object,
...

Как видишь, речь идет об одной копии. На количесво копий может повлиять как раз способ ловли — к примеру если catch ловит по значению...
Любите книгу — источник знаний (с) М.Горький
Re[7]: throw, wchar_t* и память
От: Bell Россия  
Дата: 15.04.08 10:05
Оценка:
Здравствуйте, Bell, Вы писали:

Да, и в ряде случаев компилятор может обойтись вообще без создании копии — про это в 15.1/5.
Любите книгу — источник знаний (с) М.Горький
Re[7]: throw, wchar_t* и память
От: jazzer Россия Skype: enerjazzer
Дата: 15.04.08 10:08
Оценка:
Здравствуйте, 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 (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: throw, wchar_t* и память
От: remark Россия http://www.1024cores.net/
Дата: 15.04.08 13:24
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Но лично я бы завел просто статический буфер (в TLS, если много потоков) и писал бы все в него, а в классе исключения держал бы указатель на него, и все, никаких проблем с копированием и скоростью.



Хммм... А какого размера буфер? Особенно учитывая, что одновременно может быть несколько "активных" исключений...



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: throw, wchar_t* и память
От: Vamp Россия  
Дата: 16.04.08 18:23
Оценка:
J>У тебя есть возможность корректно завершить приложение (хотя бы путем корректного проброса исключения на самый верх), чтобы отработали все деструкторы, сохранились все файлы и т.д.
Маловероятно. Если уж у тебя память кончилась, то надеятся на то, что удастся посохранять файлы и позакрывать всякие ресурсы, не особо приходится.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: throw, wchar_t* и память
От: remark Россия http://www.1024cores.net/
Дата: 16.04.08 18:29
Оценка:
Здравствуйте, Vamp, Вы писали:

J>>У тебя есть возможность корректно завершить приложение (хотя бы путем корректного проброса исключения на самый верх), чтобы отработали все деструкторы, сохранились все файлы и т.д.


V>Маловероятно. Если уж у тебя память кончилась, то надеятся на то, что удастся посохранять файлы и позакрывать всякие ресурсы, не особо приходится.



delete не аллокирует новую память, free() тоже, fclose() тоже, closesocket() тоже... вообще это хороший тон — делать функцию освобождения ресурса nofail...
ну если в лог не сможем чего записать — ну и фиг с ним.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.