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
Здравствуйте, Аноним, Вы писали:
А>А>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;
}
Здравствуйте, <Аноним>, Вы писали:
А>Ошибка понятна, но поведение странное —
А>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";
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