Прокомментируйте ошибку пожалуйста.
От: Аноним  
Дата: 30.07.05 07:18
Оценка:
using namespace std;

class Simple
{
public:
    int a;

    Simple()
    {
        cout << "Constructor\n";
        a=10;
    }
    Simple(int b)
    {
        cout << "Constructor with int\n";
        a=b;
    }
    Simple(const Simple& b)
    {
        cout << "Constructor copy\n";
        *this=b;
    }
    Simple& operator= (const Simple& c)
    {
        cout << "Operator =\n";
        if(this!=&c) *this=c;    // Здесь ошибка
        return *this;
    }

    void print() const
    {
        cout << a << "\n";
    }

};

int main()
{
    Simple temp(56);
    Simple temp2=temp;

    temp2.print();

}


Ошибка понятна, но поведение странное —
Operator =
Operator =
Operator =
.... ~100 раз
Operator =
Press any key to continue
Re: Прокомментируйте ошибку пожалуйста.
От: _nn_ www.nemerleweb.com
Дата: 30.07.05 07:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>class Simple
А>{
А>public:
А>    int a;
<skip>
А>    Simple& operator= (const Simple& c)
А>    {
А>        cout << "Operator =\n";
А>        if(this!=&c) *this=c;    // Здесь ошибка
А>        return *this;
А>    }
<skip>
А>



*this=c равносильно this->operator=(c), т.е. получается что из operator= мы вызываем самих себя.
Вот и получается рекурсия без остановки -> переполнение стека и ошибка.

Правильно написать так :
Simple& operator=(const Simple& c)
{
   cout << "operator=\n";
   a = c.a;
   return *this;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Прокомментируйте ошибку пожалуйста.
От: ansi  
Дата: 30.07.05 07:54
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Ошибка понятна, но поведение странное —

А>Operator =
А>Operator =
А>Operator =
А>.... ~100 раз
А>Operator =
А>Press any key to continue

А что странного? Уходишь в бесконечную рекурсию...
Просто IDE это отлавливает и пресекает. Попробуй запустить из проводника и будешь дожидаться stack overflow.
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Get Ready For This — 2 Unlimited";
Re: Прокомментируйте ошибку пожалуйста.
От: gbt Россия  
Дата: 30.07.05 08:04
Оценка:
Hello, , you wrote:

>
> int main()
> {
>         Simple temp(56);
>         Simple temp2=temp;

>         temp2.print();

> }
>


> Ошибка понятна, но поведение странное —

> Operator =
> Operator =
> Operator =
> .... ~100 раз
> Operator =
> Press any key to continue
Меня тоже очень заинтересовало, почему не пишется Stack overflow...

Вот что накопал:
Первый stack overflow наступает внутри WriteFile — там его, похоже никто не
ловит и он отлавливается уже в operator <<, где просто делается
setstate(badbit).
Далее выходим из operator << и принимаемся за следующую итерацию рекурсии.
Теперь запись в поток уже не выполняется, так как стоит badbit. Но в
определенный момент стек опять переполняется... Вычитал в MSDN, что если не
делать _resetstkoflw() после переполнения стека, то следующее переполнение уже
приведет UB в частности, к Access Violation. Видимо, к чему-то такому и
приводит...

--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.