код:
class CExeption {
CExeption(std::string str): m_strMsg (str);
private:
std::string m_strMsg;
};
try {
throw CExeption("Hello!");
}
catch(CExeption& ex){
/*
через что вот сюда происходит передача объекта
какова природа этого механизма?
кто ответственный за то что бы вызвать деструктор CExeption ?
*/
}
для общего развития.
Спасибо.
Здравствуйте, <Аноним>, Вы писали:
А>для общего развития.
Изучи литературу. Например
The C+ + Programming Language Third Edition Bjarne Stroustrup AT&T Labs Murray Hill, New Jersey.14 Exception Handling;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Аноним, Вы писали:
А>код:
А>
А>class CExeption {
А> CExeption(std::string str): m_strMsg (str);
А>private:
А> std::string m_strMsg;
А>};
А>try {
А> throw CExeption("Hello!");
А>}
А>catch(CExeption& ex){
А> /*
А> через что вот сюда происходит передача объекта
А> какова природа этого механизма?
А> кто ответственный за то что бы вызвать деструктор CExeption ?
А> */
А>}
А>
через стек. вызов деструктора вставит компилер
А>для общего развития.
А>Спасибо.
void Test1();
void Test2();
struct MyException
{
MyException(int code) : nCode(code) { printf("ctor\n"); }
//MyException(const MyException& obj) { nCode = obj.nCode; printf("ctor copy\n"); }
~MyException() { printf("dtor\n"); }
int nCode;
};
int _tmain(int argc, _TCHAR* argv[])
{
try {
Test1();
}
catch (MyException& ex) {
printf("exception code: %d\n", ex.nCode);
}
return 0;
}
void Test1()
{
try {
Test2();
}
catch (MyException& ex) {
ex.nCode = 300;
throw;
}
}
void Test2()
{
throw MyException(200);
}
конструктор MyException вызывается один раз, деструктор 2 раза.
раскомментируем констр. копии:
struct MyException
{
MyException(int code) : nCode(code) { printf("ctor\n"); }
MyException(const MyException& obj) { nCode = obj.nCode; printf("ctor copy\n"); }
~MyException() { printf("dtor\n"); }
int nCode;
};
но он не будет вызван никогда, зато теперь деструктор вызывается только один раз
Здравствуйте, pullover, Вы писали:
P>конструктор MyException вызывается один раз, деструктор 2 раза.
P>раскомментируем констр. копии:
P>но он не будет вызван никогда, зато теперь деструктор вызывается только один раз
Может, пока компилятор видел, что
конструктор копийАвтор: CEMb
Дата: 25.05.06
тривиальный, он позволял себе дополнительное (необязательное) копирование (ведь MyException для него всё равно, что int), а как завидел user-defined функцию, то испугался и решил обойтись? 15.1/5 вроде дает ему такую свободу.