Случайный поток выполнения C ++ при использовании точек останова в Visual Studio 2017? - PullRequest
0 голосов
/ 12 сентября 2018

Я добавил точки останова для каждой строки в редакции сообщества Visual Studio 2017 для следующего кода

#include "pch.h"
#include <iostream> 
using namespace std;

// base class 
class Vehicle {
public:
    Vehicle()
    {
        cout << " **** This is a Vehicle **** " << endl;
    }
};

// sub class derived from two base classes 
class Car : public Vehicle {

};

// main function 
int main()
{
    // creating object of sub class will 
    // invoke the constructor of base classes 
    Car obj;
    return 0;
}

Здесь задано действие для печати текста отладки при выполнении каждой строки.

Я создаю программу, затем запускаю новый экземпляр отладки. Я получил это

enter image description here

Выход № 1: первые 7 строк

main function
class car
blank line inside car class
// sub class derived
vehicle class closed
blank line after car class
// main

Затем я пересобрал программу и запустил новый экземпляр, и я получил это

enter image description here

Выход № 2: первые 7 строк

main function bracket open
// main
car class close
class car
blank line inside car class
blank line after car class
blank line after vehicle class

У меня отключена оптимизация.

Я новичок в C ++ и хотел бы знать, почему это происходит, компилируется ли он по-другому или что-то не так с выполнением действия точки останова?

РЕДАКТИРОВАТЬ: я добавил первые 7 строк вывода на скриншоте. Там вы можете видеть, что порядок выполнения действия точки останова отличается для двух запусков.

ПРИМЕЧАНИЕ: Обратите внимание, что выходные строки, которые вы видите, добавлены мной с использованием функции точки останова ->, таким образом Visual Studio будет распечатывать мое сообщение при достижении этой точки останова. Выполнение не остановится, оно просто распечатает любой текст, который я вставил в качестве действия точки останова

1 Ответ

0 голосов
/ 12 сентября 2018

У вас есть точки останова на многих строках, которые на самом деле не представляют исполняемый код.Когда приложение выполняется, эти точки останова перемещаются в ближайший исполняемый оператор.

Это можно увидеть, когда вы фактически разрываете точку останова в Visual Studio.Кажется, что некоторые из точек останова пропали, но несколько точек останова были перенесены для ссылки на одно и то же утверждение.

Для точек останова, которые перемещаются для ссылки на один и тот же оператор, порядок их сообщений отладки не определен.


Вид редактора:

enter image description here

Вид отладчика:

enter image description here

...