Влияние оператора goto в C ++ на стек

При выполнении goto оператор в C ++, два массива в фрагменте кода ниже удалены из стека? Или они будут удалены из стека, когда метод вернется?

retrySplit:
...
uint32_t primsAbove[primitives.size()];
uint32_t primsBelow[primitives.size()];
...
goto retrySplit;

Этот вопрос не связан с утечками в результате использования оператора goto, но связан с возможностью того, что вы можете взорвать свой стек.

4

Решение

Эта программа:

#include <iostream>

class X {
public:
X() { std::cout << "ctor" << std::endl; }
~X() { std::cout << "dtor" << std::endl; }
};

int main(int argc, char** argv) {
int i = 0;

label:
X a;

if (i == 0) {
i = 1;
goto label;
}

return 0;
}

Производит этот вывод:

$ ./a.out
ctor
dtor
ctor
dtor
5

Другие решения

Да, массивы уничтожены. [Stmt.jump] / 2:

При выходе из области (однако выполнено), объекты с автоматическим
срок хранения (3.7.3), который был построен в этом объеме
уничтожены в обратном порядке их постройки. […] Перечислить из
петли, вне блока, или вернуться за инициализированную переменную с
длительность автоматического хранения предполагает уничтожение объектов с
продолжительность автоматического хранения, находящаяся в области действия в переданной точке
от, но не в точке, переданной в.

Вы также можете проверить это с помощью следующего фрагмента:

#include <iostream>

struct A
{
A() {std::cout << "A";}
~A() {std::cout << "D";}
};

int main()
{
int counter = 0;

label:
if (counter++) // Exit on second run.
return 0;

A a;
goto label;
}

демонстрация. Ваш вывод должен быть AD,
Обратите внимание, что counter не разрушается при прыжке назад в label,

5

Вещи удаляются из стека, когда они выходят из области видимости (попадают в закрывающую скобку), так что это действительно зависит от того, куда будет идти ваш переход.

Кроме того, это немного примечание, но почему вы используете goto? Вы должны искать их, поскольку они немного позорные.

1

Быть удаленным из стека и быть живым — это две разные вещи. В вашем примере память в стеке для массивов может быть сохранена, однако после перехода к метке массивы будут считаться не живыми. То есть до того, как будут вызваны деструкторы перехода для элементов массивов, и когда элемент управления достигнет определения массива, когда будут вызываться конструкторы элементов массивов.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector