Единственный способ для этого вызвать переполнение стека (кроме ошибки в компиляторе, которая, за мои 15 лет работы с C ++, я обнаружил редкую по сравнению с моими собственными ошибками), заключается в том, что Foo(const Bar&)
создает Foo
объект, передающий его Bar
объект . Подобные ошибки могут быть тонкими и их трудно найти, посмотрев на код.
Но если у вас VS2005, у вас под рукой довольно хороший отладчик. Поместите точку останова в этот конструктор, запускайте программу до тех пор, пока вы не достигнете точки останова, затем запускайте снова, пока вы не достигнете точки останова во второй раз. Изучение стека покажет вам, как это происходит.
Если не каждый вызов этого конструктора вызовет переполнение стека, вы можете добавить этот код:
namespace { unsigned int recursion_detector = 0; }
Foo::foo(const Bar& bar)
{
if(recursion_detector++)
++recursion_detector; // meaningless code just to put a breakpoint here
// rest of constructor code
}
и поставьте точку останова в указанной строке, которая будет достигнута, когда произойдет рекурсия.