Условная автоматическая переменная

void function(typeA* ptr_to_A) {
if (!ptr_to_A) {
typeB B; // typeB is a derived class of typeA
ptr_to_A = &B;
}
do_stuff_to_ptr_to_A(ptr_to_A);
// my hope is that B is still in scope here so that this function will operate on my B object (which is on the stack) which only gets created if ptr_to_A was initially NULL
}

Будет ли эта функция делать то, что я думаю (что я хочу, чтобы она делала)? То есть выделять только B в стеке, если аргумент был нулевым указателем?

0

Решение

Будет ли эта функция делать то, что я думаю?

Нет, это неопределенное поведение, потому что B выходит за рамки. Поскольку это неопределенное поведение, все может произойти, и поэтому вы не можете предсказать результаты. Вы хотите сохранить B по крайней мере в той же области, что и вызов функции, поэтому просто переместите его в начало метода:

void function(typeA* ptr_to_A) {
typeB B; // typeB is a derived class of typeA
if (!ptr_to_A) {
ptr_to_A = &B;
}
do_stuff_to_ptr_to_A(ptr_to_A);
}

Но если вы только хотите выделить typeB если ptr_to_A равен нулю, то вы можете сделать это:

void function(typeA* ptr_to_A) {
if (!ptr_to_A) {
typeB B; // typeB is a derived class of typeA
do_stuff_to_ptr_to_A(&B);
} else {
do_stuff_to_ptr_to_A(ptr_to_A);
}
}
1

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

Вы объявляете B типа B в фигурных скобках, что означает, что он будет действителен только в пределах этого условного оператора if, то есть вышел из области видимости. Объявите B перед оператором if.
B будет назначен только тогда, когда ptr_to_A равен нулю.
Если вы намереваетесь передать ptr_to_A из функции «function ()», у вас будут проблемы, поскольку B является локальной функцией.

0

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