Как происходит передача объекта?
От: Аноним  
Дата: 05.09.06 12:49
Оценка:
код:


class CExeption {
  CExeption(std::string str): m_strMsg (str);
private:
 std::string m_strMsg;
};

try {
 throw CExeption("Hello!");
}
catch(CExeption& ex){
  /*
   через что вот сюда происходит передача объекта
   какова природа этого механизма?
   кто ответственный за то что бы вызвать деструктор CExeption ?
  */
}


для общего развития.
Спасибо.
Re: Как происходит передача объекта?
От: np9mi7 Россия  
Дата: 06.09.06 05:21
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>для общего развития.


Изучи литературу. Например 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>>
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
Re: Как происходит передача объекта?
От: Константин Л. Франция  
Дата: 06.09.06 09:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>код:


А>

А>class CExeption {
А>  CExeption(std::string str): m_strMsg (str);
А>private:
А> std::string m_strMsg;
А>};

А>try {
А> throw CExeption("Hello!");
А>}
А>catch(CExeption& ex){
А>  /*
А>   через что вот сюда происходит передача объекта
А>   какова природа этого механизма?
А>   кто ответственный за то что бы вызвать деструктор CExeption ?
А>  */
А>}
А>


через стек. вызов деструктора вставит компилер

А>для общего развития.

А>Спасибо.
Re[2]: хм... интересное поведение
От: pullover  
Дата: 06.09.06 11:13
Оценка:
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;
};



но он не будет вызван никогда, зато теперь деструктор вызывается только один раз
Re[3]: хм... интересное поведение
От: Roman Odaisky Украина  
Дата: 06.09.06 16:45
Оценка:
Здравствуйте, pullover, Вы писали:

P>конструктор MyException вызывается один раз, деструктор 2 раза.

P>раскомментируем констр. копии:
P>но он не будет вызван никогда, зато теперь деструктор вызывается только один раз

Может, пока компилятор видел, что конструктор копий
Автор: CEMb
Дата: 25.05.06
тривиальный, он позволял себе дополнительное (необязательное) копирование (ведь MyException для него всё равно, что int), а как завидел user-defined функцию, то испугался и решил обойтись? 15.1/5 вроде дает ему такую свободу.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.